繁体   English   中英

这两个mysql查询之间的区别

[英]Difference between these two mysql queries

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

 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)的记录? 还是迭代更多?

在标准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的所有查询视为该子句中的所有非聚合列。 例如

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的工作方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM