【问题标题】:MySQL query to get row count when no data available, skip result when add where clauseMySQL查询在没有可用数据时获取行数,添加where子句时跳过结果
【发布时间】:2019-07-28 19:57:12
【问题描述】:

即使该日期没有数据,我的以下查询也会显示数据计数。

选择 c.date 作为日期,计数 (s.insertTime) 作为 tot_cnt FROM (SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i* 10 + t0.i) 日期从(选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)t0, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)t2, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4 ) c LEFT JOIN `access_log` s ON c.date = DATE(s.insertTime) WHERE UNIX_TIMESTAMP(c.date) BETWEEN 1563733801 AND 1564338599 GROUP BY c.date ORDER BY c.date;

但是当我添加 userId=8 时,它会跳过所有没有任何值的日期范围

选择 c.date 作为日期,计数 (s.insertTime) 作为 tot_cnt FROM (SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i* 10 + t0.i) 日期从(选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)t0, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)t2, (选择 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4 ) c LEFT JOIN `access_log` s ON c.date = DATE(s.insertTime) WHERE UNIX_TIMESTAMP(c.date) BETWEEN 1563733801 AND 1564338599 AND userId=8 GROUP BY c.date ORDER BY c.date;

我需要所有日期,即使它们没有价值,也需要应用 userId=8 过滤记录。

【问题讨论】:

  • 用户 8 在 LEFT JOINed 表上吗?如果是这样,请将其移至 JOIN

标签: mysql database


【解决方案1】:

ON 子句而不是WHERE 子句中应用条件:

ON c.date = DATE(s.insertTime) AND userId=8

所以LEFT JOIN 返回不匹配的行。

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多