【问题标题】:Make SQL query select only one of the WHERE conditions使 SQL 查询仅选择 WHERE 条件之一
【发布时间】:2019-06-26 10:44:49
【问题描述】:

我正在尝试在 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 中最早的日期。

我似乎无法弄清楚这一点,而不是“OR”,它理想地用作“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

【问题讨论】:

  • 也许使用case 语句来返回结果。
  • 我试过了,因为这两种情况都是正确的,所以它都返回了,虽然因为我将它限制为 1,所以只有 1 个结果通过,但是错误的,我需要结束或退出在发现为真的第一个条件之后

标签: php sql if-statement conditional-statements


【解决方案1】:

将排名放在您的 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 为真时,表达式的结果为 1,我们更喜欢 0(按降序排列)。

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

【讨论】:

  • 不错!这是有效的,谢谢你,我想知道是否有其他方法可以达到相同的结果。是的,您可以在 MySQL 中将日期添加为 0000-00-00,我相信当您插入具有日期字段但没有日期值的新行时,它是默认值。
  • 你为什么要另辟蹊径?看起来很简单:从最好到最坏的顺序排列行,然后选择第一个。顺便说一下,如果您插入一行而不指定日期,那么它的值对于任何其他数据类型都将为空。
  • 从 MySQL 8 开始,您可以使用 ROW_NUMBERRANKDENSE_RANK 对行进行排名。然后你写一个外部查询,你只保留行where the_rank = 1。这使得获得 per 客户/订单/用户/随便什么的最佳行成为可能。但技术实际上是相同的,因为所有这些函数都有一个 ORDER BY 子句,您可以使用与我的回答中相同的方式。
  • 是的,这很简单,我只是想知道从解谜的角度来看,如果可能的话,还能怎么做。是的,您有权将其设置为空!我们只是将其默认设置为 0000-00-00。
  • MySQL 允许 0000-00-00 让我有点难过。数据类型的一方面是保证有效值。您不能将 1.23 存储在整数列中,也不能将“鼠标”存储在数字列中。您应该只能将有效日期存储在日期列中,而不是“1234-56-78”或“0000-00-00”。
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2020-08-29
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多