【问题标题】:left join messing the query up左连接弄乱了查询
【发布时间】:2020-06-01 22:46:27
【问题描述】:

我在使用这个查询时遇到了一些问题,它没有返回应有的所有行:

SELECT DE.user_id, 
       DE.id, 
       DE.title, 
       DE.limit_new_cards, 
       DE.limit_old_cards, 
       DE.deleted, 
       Count(DISTINCT TCA.id) total_cards, 
       Count(DISTINCT NCA.id) new_cards, 
       Count(DISTINCT OCA.id) due_cards 
FROM   decks AS DE 
       LEFT JOIN cards AS TCA 
              ON TCA.deck_id = DE.id 
       LEFT JOIN cards AS NCA 
              ON NCA.deck_id = DE.id 
                 AND NCA.is_new = 1 
       LEFT JOIN cards AS OCA 
              ON OCA.deck_id = DE.id 
                 AND OCA.due_date <= CURRENT_DATE() 
WHERE  DE.user_id = 47 
GROUP  BY TCA.deck_id 
ORDER  BY DE.id;

它应该返回与此查询相同的行数吗?还是不行?

SELECT user_id, 
       id, 
       title, 
       limit_new_cards, 
       limit_old_cards, 
       deleted, 
FROM   decks 
WHERE  user_id = 47 
ORDER  BY id; 

如果有人可以帮助我,我会很高兴。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: mysql sql join group-by left-join


【解决方案1】:

我怀疑问题出在您的GROUP BY 子句上:

GROUP BY TCA.deck_id 

应该是:

GROUP BY DE.id 

基本原理:TCA 是一个 LEFT JOINed 表,具有以下条件:

ON TCA.deck_id = DE.id 

TCA 中没有匹配项时,TCA.deck_id 就是NULL,那么你就是GROUP BY。因此,您最终会将在 TCA 中不匹配的所有 DE.ids 组合在一起。相反,您应该使用基表 DE 中的相应列 - 大概永远不会是 NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多