问题加入多个表mysql

时间:2013-09-12 16:46:36

标签: mysql sql

SELECT    taxi.id as id,name,
  SUM(storico_pagamenti.importo) AS pagamentitotali,
  SUM(CASE WHEN storico_pagamenti.data <= '$timestop' AND storico_pagamenti.data >=     '$timestart' THEN storico_pagamenti.importo ELSE 0 END) AS pagamentimese,
  SUM(storico_fatture.importo) AS fatturetotali,
  SUM(CASE WHEN storico_fatture.data <= '$timestop' AND storico_fatture.data >= '$timestart' THEN storico_fatture.importo ELSE 0 END) AS fatturemese,
  COUNT(giornifermi.registrazione) as giornifermitotali,
  SUM(CASE WHEN giornifermi.data <= '$timestop' AND giornifermi.data >= '$timestart' THEN 1 ELSE 0 END) AS giornifermimese
FROM taxi 
  LEFT JOIN storico_pagamenti ON taxi.id = storico_pagamenti.id_taxi
  LEFT JOIN storico_fatture ON storico_pagamenti.id_taxi=storico_fatture.id_taxi
  LEFT JOIN giornifermi ON storico_fatture.id_taxi=giornifermi.id_taxi
WHERE taxi.categoria='cv'
GROUP BY  taxi.id;

我的mysql技能对于这个查询还不够......无法理解问题出在哪里。不起作用的部分是这个

SUM(CASE WHEN giornifermi.data <= '$timestop' AND giornifermi.data >= '$timestart' THEN 1
ELSE 0 END) AS giornifermimese

我希望在两个提交日期之间给我giornifermi.data行的计数

和另一部分:

COUNT(giornifermi.registrazione) as giornifermitotali

我希望能够给我giornifermi.registrazione

中所有行的计数

这是因为加入吗?或者这是查询的两个部分中的问题吗?

EDIT ----------------------------------------- 我现在已经将所有表“ON”相关的引用者taxi.id设置为等于其他表的变量id_taxi,现在我得到的值却错了。在@Twelf的建议之后我试图评论“GROUP BY taxi.id”并尝试选择*。我现在看到的问题是结果成倍增加。示例如果我在giornifermi中有三行,则它们变为6,如果我在storico_pagamenti中有2行,它会再次复制storico_pagamenti中每行的三行。在不知道如何解决这个问题,但知道问题总比没有好

EDIT ------------------------------------------ 通过在左连接后添加子查询来修复,而不是加入giornifermi的整个表,我创建了一个全新的表来更正数据而不重复

LEFT JOIN (SELECT 
taxi.id as i,
COUNT(giornifermi.registrazione) as giornifermitotali,
SUM(CASE
    WHEN giornifermi.data <= '$timestop' AND giornifermi.data >= '$timestart' THEN 1
        ELSE 0
    END) as giornifermimese
FROM taxi
LEFT JOIN giornifermi ON taxi.id=giornifermi.id_taxi
GROUP BY taxi.id
) AS NUOVATABELLA ON taxi.id=NUOVATABELLA.i

1 个答案:

答案 0 :(得分:1)

从你的问题中无法分辨,但是对于“错误”的基本故障排除:

  1. 如果计数过高且您有JOIN,那么它可能不足JOIN条件,IE笛卡尔积。
  2. 如果计数过低,您可能会通过WHERE条件或限制性JOIN条件排除您不想要的记录。
  3. 选择一小部分记录的所有字段,以帮助查看差异的来源。
  4. 更新

    您的一个或多个表包含所有/某些taxi_ID值的多个条目。

    为每个表运行:

    SELECT taxi_ID 
    FROM storico_pagamenti 
    GROUP BY taxi_ID HAVING COUNT(*) > 1
    

    如果任何表返回记录,请查看它们以查看是否应在JOIN中使用另一个字段来区分重复项。