问题描述
我有一张桌子:
消息:
虽然我可以在多个查询中选择所需的消息,但我需要在一个查询中完成:
这是我目前的疑问:
$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
,但适用于'-'
。