left-join把查询搞砸了

lmyy7pcs  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(367)

我对此查询有一些问题,它没有按原样返回所有行:

  1. SELECT DE.user_id,
  2. DE.id,
  3. DE.title,
  4. DE.limit_new_cards,
  5. DE.limit_old_cards,
  6. DE.deleted,
  7. Count(DISTINCT TCA.id) total_cards,
  8. Count(DISTINCT NCA.id) new_cards,
  9. Count(DISTINCT OCA.id) due_cards
  10. FROM decks AS DE
  11. LEFT JOIN cards AS TCA
  12. ON TCA.deck_id = DE.id
  13. LEFT JOIN cards AS NCA
  14. ON NCA.deck_id = DE.id
  15. AND NCA.is_new = 1
  16. LEFT JOIN cards AS OCA
  17. ON OCA.deck_id = DE.id
  18. AND OCA.due_date <= CURRENT_DATE()
  19. WHERE DE.user_id = 47
  20. GROUP BY TCA.deck_id
  21. ORDER BY DE.id;

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

  1. SELECT user_id,
  2. id,
  3. title,
  4. limit_new_cards,
  5. limit_old_cards,
  6. deleted,
  7. FROM decks
  8. WHERE user_id = 47
  9. ORDER BY id;

如果有人能帮我,我会很高兴的。

kgqe7b3p

kgqe7b3p1#

我怀疑问题出在你身上 GROUP BY 条款:

  1. GROUP BY TCA.deck_id

应该是:

  1. GROUP BY DE.id

理论基础: TCA 是一个 LEFT JOIN 具有以下条件的ed表:

  1. ON TCA.deck_id = DE.id

没有对手的时候 TCA , TCA.deck_idNULL ,那你呢 GROUP BY . 所以你最终得到了 DE.id 没有对手的 TCA 组合在一起。相反,您应该使用基表中相应的列 DE -想必,这是永远不会发生的 NULL .

相关问题