首页 > 解决方案 > 在单个查询中选择具有多个值的最后 N 行

问题描述

我有一张桌子:

留言:

<id-title-body-city-street-building-created on >

虽然我能够在多个查询中选择所需的消息,但我需要在一个查询中完成:

以下是我目前的疑问:

$queryOne = "SELECT `id`, `title`, `body`, `created_on` FROM `fcm_messages` WHERE `city`='$city' AND `street`='$street' AND `building`='$building'";
$queryTwo = "SELECT `id`, `title`, `body`, `created_on` FROM `fcm_messages` WHERE `city`='$city' AND `street`='$street' AND `building`='-'";
$queryThree = "SELECT `id`, `title`, `body`, `created_on` FROM `fcm_messages` WHERE `city`='$city' AND `street`='-' AND `building`='-'";
$queryFour = "SELECT `id`, `title`, `body`, `created_on` FROM `fcm_messages` WHERE `city`='-' AND `street`='-' AND `building`='-'";

我需要一个查询,因为我可以使用 ORDER BY id DESC 对所有消息进行排序,非常适合我的需要。

我可以对我现在拥有的查询应用相同的排序,但它会给出相同的结果,因为稍后它们会被一个接一个地推入数组,并且顺序会被打乱。

标签: phpmysqlsqlselectwhere-clause

解决方案


我认为更简单的方法是布尔逻辑:

SELECT `id`, `title`, `body`, `created_on` 
FROM `fcm_messages` 
WHERE 
    (`city` = :city AND `street` = :street AND `building` = :building)
    OR (`city` = :city AND `street` = :street AND `building` = '-')
    OR (`city` = :city AND `street` = '-' AND `building` = '-')
    OR (`city` = '-' AND `street` = '-' AND `building` = '-')

请注意,这使用查询参数将变量传递给查询,而不是将它们连接到查询字符串中:这既安全又高效。


推荐阅读