【问题标题】:Select last N rows with multiple values in a single query在单个查询中选择具有多个值的最后 N 行
【发布时间】:2020-12-13 21:37:24
【问题描述】:

我有一张桌子:

消息:

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

这是我目前的疑问:

$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 对所有消息进行排序,非常适合我的需要。

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

【问题讨论】:

  • 那么,将所有查询中的现有 WHERE 子句加入 OR ...?
  • @CBroe 意思是我应该只做 $queryOne 或 $queryTwo 或 $queryThree 或 $queryFour?
  • 不,当然不是,这甚至没有意义。进行一个查询,使用WHERE (…) OR (…) OR …
  • 请注意,将未知值存储为 NULL 有一个约定

标签: php mysql sql select where-clause


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以通过将每个条件放入括号中并通过逻辑或为每个条件组合它们来构建查询。

    $query = "SELECT `id`, `title`, `body`, `created_on` FROM `fcm_messages` WHERE ";
    
    $conditions[] = "(`city`='$city' AND `street`='$street' AND `building`='$building')";
    $conditions[] = "(`city`='$city' AND `street`='$street' AND `building`='-')";
    $conditions[] = "(`city`='$city' AND `street`='-' AND `building`='-')";
    $conditions[] = "(`city`='-' AND `street`='-' AND `building`='-')";
    
    $query .= join(' OR ', $conditions);
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 2021-10-25
        • 2017-01-06
        • 2020-12-08
        相关资源
        最近更新 更多