【问题标题】:query forumaltion with multiple joins and multiple count for each table每个表具有多个连接和多个计数的查询论坛
【发布时间】:2012-08-21 10:19:03
【问题描述】:

大家好,希望你们能帮帮我。

我正在尝试进行查询,以便在三个不同的表中拥有一个带有外键的主表。现在我想分别计算它在所有 3 个表中的条目。这是我目前所拥有的,希望你们能帮助我解决它。

SELECT box_code.id, count( box_code_unused.id ) AS total, count( box_code_used.id ) AS total2, count( box_code_expired.id ) AS total3
FROM box_code
JOIN box_code_used ON box_code_used.box_code_id = box_code.id
JOIN box_code_unused ON box_code_unused.box_code_id = box_code.id
JOIN box_code_expired ON box_code_expired .box_code_id = box_code.id
GROUP BY box_code.id

如果我只从一个表中计算条目,这种方法会起作用,但由于我从 3 个表中计算它不正确。

提前致谢。

【问题讨论】:

  • 计数不正确的原因是什么?

标签: mysql join count


【解决方案1】:

您可能会出现count distinct ID:

SELECT box_code.id, 
       count(distinct box_code_unused.id ) AS total, 
       count(distinct box_code_used.id ) AS total2, 
       count(distinct box_code_expired.id ) AS total3
FROM box_code
LEFT JOIN box_code_used ON box_code_used.box_code_id = box_code.id
LEFT JOIN box_code_unused ON box_code_unused.box_code_id = box_code.id
LEFT JOIN box_code_expired ON box_code_expired .box_code_id = box_code.id
GROUP BY box_code.id

【讨论】:

  • 是的,成功了。但修复它的并不是完全不同的,而是左连接。
  • @death_relic0 哦,我现在明白了。无论如何,ID 都是不同的,因为它们是表本身的 ID,而不是外键。对疏忽感到抱歉。
【解决方案2】:

像这样使用子查询:

SELECT box_code.id, 
    (SELECT COUNT(*) FROM box_code_used b1 WHERE b1.box_code_id = box_code.id) AS total1,
    (SELECT COUNT(*) FROM box_code_unused b2 WHERE b2.box_code_id = box_code.id) AS total2,
    (SELECT COUNT(*) FROM box_code_expired b3 WHERE b3.box_code_id = box_code.id) AS total3
FROM box_code

【讨论】:

    【解决方案3】:

    我认为您可以使用右连接。这样它将包含一个表中不可用但在另一个表中可用的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2018-05-30
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多