【问题标题】:MySQL Returning Value that Should Be NullMySQL返回值应该为空
【发布时间】:2015-04-23 15:29:01
【问题描述】:

我正在编写一个查询,它将查看上周并选择一个值并给我它使用的计数......非常简单的概念,除了当我运行查询时我得到一个结果并且系统没有t 上周使用!

SELECT re.topic, COUNT(*) AS TimesUsed 
FROM ost_ticket AS us
  JOIN ost_help_topic AS re ON re.topic_id = us.topic_id
WHERE re.created  >= CURDATE() - INTERVAL (WEEKDAY(CURDATE())+7) DAY
  AND re.created  <  CURDATE() - INTERVAL (WEEKDAY(CURDATE())) DAY
GROUP BY us.topic_id  ORDER BY TimesUsed DESC LIMIT 1

我可以确认上周没有票,因为当我运行查询以查看上周是否创建了任何内容时,答案为空。

SELECT number
FROM ost_ticket
WHERE created  >= CURDATE() - INTERVAL (WEEKDAY(CURDATE())+7) DAY
  AND created  <  CURDATE() - INTERVAL (WEEKDAY(CURDATE())) DAY; 

所以我的问题本质上是我在日期选择上做错了什么以获得上周的日期?

【问题讨论】:

  • 在第一个查询中检查表“re”中的创建日期,第二个查询中检查表“ost_ticket”中的创建日期...

标签: mysql


【解决方案1】:

您正在混合 intervals 和日期值。如果你想检查系统上周是否在使用,只需从curdate()中减去7天的时间间隔即可:

SELECT re.topic, COUNT(*) AS TimesUsed 
FROM ost_ticket AS us
  JOIN ost_help_topic AS re ON re.topic_id = us.topic_id
WHERE re.created  >= CURDATE() - INTERVAL 7 DAY -- Here!
  AND re.created  <= CURDATE() -- And here
GROUP BY us.topic_id  ORDER BY TimesUsed DESC LIMIT 1

【讨论】:

  • 我认为“上周”应该是指“在前两个星期一之间”或类似日期计算的意思。
  • 是的,前一个星期一之间是我的目标。
【解决方案2】:

我能够从 select 语句中选择以获取我需要的列,其中包含自上周一以来的日期。

SELECT 
    t1.topic
FROM
    (SELECT 
        re.topic AS topic, COUNT(*) AS TimesUsed
    FROM
        ost_ticket AS us
    JOIN ost_help_topic AS re ON re.topic_id = us.topic_id
    WHERE
        re.created BETWEEN DATE(DATE_SUB(DATE_SUB(NOW(), INTERVAL ((7 + WEEKDAY(DATE_SUB(NOW(), INTERVAL 1 WEEK)) - 4) % 7) DAY), INTERVAL 4 DAY)) AND DATE_FORMAT(DATE_SUB(NOW(), INTERVAL ((7 + WEEKDAY(DATE_SUB(NOW(), INTERVAL 1 WEEK)) - 4) % 7) DAY), '%Y-%m-%d')
    GROUP BY us.topic_id
    ORDER BY TimesUsed DESC
    LIMIT 1) t1;

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2022-01-20
    • 2012-07-21
    • 2015-06-17
    相关资源
    最近更新 更多