在单个查询中选择具有多个值的最后N行

问题描述

我有一张桌子:

消息:

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

这是我目前的疑问:

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

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

我可以对目前使用的查询进行相同的排序,但是会产生相同的结果,因为稍后它们会被一个一个地推入数组,并且顺序会混乱。

解决方法

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

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` = '-')

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

,

您只需将每个条件放在方括号中,并通过逻辑或将它们组合起来就可以构建查询。

~/Android
,

在MySQL中,您可以利用元组:

SELECT `id`,`created_on` 
FROM `fcm_messages` 
WHERE (city,street,building) in ( (:city,:street,:building),(:city,'-'),'-',('-','-') )

注意:在许多情况下,“通用”值将存储为NULL。这不适用于IN,但适用于'-'