这两个mysql查询之间的区别

时间:2015-11-16 09:55:31

标签: mysql sql

我想知道这两个查询之间的区别:第一个查询给了我所有的记录,就好了。

 Select * from table1 where tender_id='$tender_id' group by supplier_name

但是在下面的查询中我添加了一个sum(case),但是我没有得到所需的输出。第一个查询显示所有记录,但第二个查询未显示所有记录。我犯了什么错误?

select cs.*, tender_id, 
SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal, 
SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal  
from table1 cs 
where cs.tender_id='$tender_id' 
group by cs.supplier_name

我想知道第二个查询是否可以显示所有带条件的记录(tender_id)?或者它的迭代更多?

1 个答案:

答案 0 :(得分:0)

  

在标准SQL中,包含GROUP BY子句的查询无法引用   选择列表中未分配的非聚合列   GROUP BY子句。   看(例如)https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

使用GROUP BY子句时,MySQL有一个不幸的(在我看来是不正确的)默认行为。此查询在大多数SQL数据库中无效:

Select * from table1 where tender_id='$tender_id' group by supplier_name

如果已启用ONLY_FULL_GROUP_BY SQL模式,它在MySQL中无效。

我强烈建议您将使用GROUP BY的所有查询视为需要该子句中的所有非聚合列。 e.g。

select
    cs.supplier_name
  , SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal
  , SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal  
from table1 cs 
where cs.tender_id='$tender_id' 
group by
    cs.supplier_name

如果您需要额外的列,例如

select
    cs.supplier_name
  , tender_id
  , SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal
  , SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal  
from table1 cs 
where cs.tender_id='$tender_id' 
group by
    cs.supplier_name
  , tender_id

等等。当然,当您在group by子句中包含更多列时,您可能会增加生成的行数,但这就是GROUP BY应该如何工作。