首页 > 解决方案 > 使 SQL 查询仅选择 WHERE 条件之一

问题描述

我正在尝试在 PHP 中运行一个 SQL 查询,该查询应该基于以下两个字段返回一行:

  1. first_shown_date
  2. last_shown_date

我正在尝试根据以下条件选择一行:

  1. last_shown_date= 今天的日期,如果为假则:
  2. first_shown_date= 0000-00-00,如果为假则:
  3. last_shown_date最旧的日期,这将是默认的

我当前拥有的查询给了我错误的行,因为我有一行last_shown_date设置为今天的日期,所以这是应该显示的行,但实际显示的行是日期最早的行last_shown_date

我似乎无法弄清楚这一点,而不是“或”,它理想地用作“IF ELSE”语句,因此如果规则 #1 失败,则选择下一个,但如果规则 #1 为真,然后使用那个而不是下一个。我尝试了 if 语句和 CASE,但它们也没有按需要工作。

这是我目前拥有的代码:

    SELECT 
    `id`,
    `content`

    FROM `".USED_TBL."` 

    WHERE 
    `last_shown_date` = '$dateDB' OR (`last_shown_date` != '$dateDB' AND
    `first_shown_date` = '0000-00-00' OR(`first_shown_date` != '0000-00-00' AND
    `last_shown_date` < '$dateDB'))
    AND `status` != 2

    ORDER BY
    `last_shown_date` ASC
    LIMIT 1

标签: phpsqlif-statementconditional-statements

解决方案


将排名放在您的 ORDER BY 子句中:

ORDER BY
  (last_shown_date = CURRENT_DATE) DESC,
  (first_shown_date = DATE '0000-00-00') DESC,
  last_shown_date
LIMIT 1

这利用了 MySQL 的 true = 1, false = 0,例如当last_shown_date = CURRENT_DATE为 true 时,表达式的结果是 1,我们更喜欢 0(按降序排列)。

(顺便问一下:MySQL 中的日期真的可以是 0000-00-00 吗?)


推荐阅读