当我使用GROUP BY时,为什么我的MySQL结果不正确?

时间:2012-10-11 12:39:49

标签: mysql sql

我有一个简单的表(ID,Member_ID,付款,日期,payment_serial,running_total);我需要payment_serial来使用数据导出到另一个系统。

我需要的导出是会员支付的所有款项(显示付款和日期),按payment_serial和单行排序。

这是我使用的第一个查询:

SELECT
  `Member_ID`,
  IF(`payment_serial`=1,`payment`,0) AS `p1`,
  IF(`payment_serial`=1,`date`,0) AS `p1_date`,
  IF(`payment_serial`=1,`ID`,0) AS `p1_ID`,
  IF(`payment_serial`=2,`payment`,0) AS `p2`,
  IF(`payment_serial`=2,`date`,0) AS `p2_date`
  IF(`payment_serial`=2,`ID`,0) AS `p2_ID`,
FROM monthlies
WHERE `Member_ID` = 4198739

如果我使用此查询,我会看到我需要的付款,但每个付款都在一个单独的行上(这会在下一阶段产生很大的导入问题):

Member_ID    p1     p1_date  p1_ID    p2    p2_date  p2_ID ...
  4198739   34.50    41143    214      0      0       0    ... 
  4198739     0        0       0     34.50  41176    583   ...

我添加了GROUP BY:

SELECT
  IF(`payment_serial`=1,`payment`,0) AS `p1`,
  IF(`payment_serial`=1,`date`,0) AS `p1_date`,
  IF(`payment_serial`=1,`ID`,0) AS `p1_ID`,
  IF(`payment_serial`=2,`payment`,0) AS `p2`,
  IF(`payment_serial`=2,`date`,0) AS `p2_date`,
  IF(`payment_serial`=2,`ID`,0) AS `p2_ID`
FROM monthlies
WHERE `Member_ID` = 4198739
GROUP BY `Member_ID`

这为每个成员提供了一行 - 但每笔付款:

Member_ID    p1     p1_date  p1_ID    p2    p2_date  p2_ID ...
  4198739   34.50    41143    214      0      0       0    ... 

我哪里错了?

3 个答案:

答案 0 :(得分:2)

这不完全是你的错。 MySQL实现GROUP BY错误。此时,任何其他SQL平台都会给您一个语法错误。

尝试

SELECT 
  MAX(IF(`payment_serial`=1,`payment`,0)) AS `p1`, 
  MAX(IF(`payment_serial`=1,`date`,0)) AS `p1_date`, 
  MAX(IF(`payment_serial`=1,`ID`,0)) AS `p1_ID`, 
  MAX(IF(`payment_serial`=2,`payment`,0)) AS `p2`, 
  MAX(IF(`payment_serial`=2,`date`,0)) AS `p2_date`, 
  MAX(IF(`payment_serial`=2,`ID`,0)) AS `p2_ID` 
FROM monthlies 
WHERE `Member_ID` = 4198739 
GROUP BY `Member_ID` 

答案 1 :(得分:2)

您期望GROUP_BY输出错误。在MySQL中GROUP_BYMAX, AVG, SUM等命令一起使用,以便在统一行中获得所有结果。

因此,如果要导出数据,最好的方法是在不使用group by的情况下获取所有行,因为它将保留每一行的唯一成员ID。

答案 2 :(得分:0)

GROUP BY位于SELECT的IF之前。