0
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-------------------------------------------- 我现在已经关联了所有表格“打开”相同的推荐人taxi.id 将其设置为等于其他表的变量id_taxi,现在我得到了值但错误。在@Twelf 的建议之后,我尝试评论“GROUP BY tax.id”并尝试选择 *。我现在看到的问题是结果成倍增加。示例如果我在 giornifermi 中有三行,它们变成了 6,如果我在 storico_pagamenti 中有 2 行,它会再次复制我在 storico_pagamenti 中每一行的三行。在不知道如何解决这个问题,但知道问题总比没有好

EDIT-------------------------------------------------------- 通过在left join,而不是加入整个 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
4

1 回答 1

1

从您的问题中无法判断,但“错误”计数的基本故障排除:

  1. 如果计数太高而您有JOIN',则可能是JOIN标准不足,即 IE 笛卡尔积。
  2. 如果计数太低,您可能会通过WHERE标准或限制性JOIN标准排除您不打算使用的记录。
  3. 选择一小部分记录的所有字段,以帮助查看差异来自何处。

更新:

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

为每个表运行:

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

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

于 2013-09-12T17:10:18.740 回答