我有一个mysql表和一个执行下一个查询的表:在customer\u id=ced130828mj8的表中选择different customer\u name。
该查询的目的是只获取有关customer\u name和customer\u id的列表。
有时某些客户id缺少客户名称(是的,我知道unique key,但这不是问题所在)。所以,因为我做了一个concat,如果customer\u name是空的,那么customer\u name=customer\u id
很明显,id\u用户将更改。这就是我的疑问:
SELECT DISTINCT(
IF(Dealer_Name<>'',
CONCAT(Dealer_Name, '*',Dealer_ID),
CONCAT(Dealer_ID, '*',Dealer_ID)
)
) AS cc FROM received_invoices
WHERE Customer_ID='CED130828MJ8'
GROUP BY (cc)
ORDER BY cc ASC";
查询结果就是这样的:
"BEST BUY LTD CO*BTB052YU96"
几乎可以,我的意思是几乎可以,因为它只选择表中的一个customer\u id,但是如果一个customer\u id有两个或更多的记录,它将打印两个记录。
让我给你看看:
"GERARDO GARCIA RIVERA*GARG870805726"
"GERARDO GARSIA RIBERA*GARG870805726"
"JERARDO GARZIA RIVERA*GARG870805726"
"JUAN ANTONIO MUÑOZ*MUGJ540314TV4"
"GUAN ANTONIO MUNIOZ*MUGJ540314TV4"
"JUAN ANTOÑO MUÑIOS*MUGJ540314TV4"
"JUAN HANTOIO MUÑOC*MUGJ540314TV4"
但我真正想要的不是每个客户id只获取1条记录,比如:
"GERARDO GARCIA RIVERA*GARG870805726"
"JUAN ANTONIO MUÑOZ*MUGJ540314TV4"
我遗漏了什么?你有什么建议?
提前谢谢
3条答案
按热度按时间xfyts7mz1#
@madhur bhaiya。
首先,感谢您的关注,您的伟大,正如您所说,这就是答案:
在我的特定情况下,可能不在其他人中,当我执行该查询时,它会抛出错误:错误代码:1055。select列表的表达式#1不在group by子句中,它包含未聚合的列“facturacion.facturas_recibidas.emissor_razon_social”,该列在功能上不依赖于group by子句中的列;这与sql\u mode=only\u full\u group by不兼容
所以我搜索了一下,发现当这种错误发生时,我只能禁用full group by。
为了做到这一点,我需要修改我的/etc/mysql/my.cnf,因为我有ubuntu linux,我是这样做的:
sudo nano/etc/mysql/my.cnf
将此添加到文件末尾
[mysqld]sql\u mode=“strict\u trans\u tables,no\u zero\u in \u date,no\u zero\u date,error\u for \u division \u by \u zero,no\u auto \u create \u user,no \u engine \u substitution”4.严格的\u事务表,没有日期中的零,没有日期,错误\u除以零,没有自动创建用户,没有引擎替换。对于重新启动mysql服务器并应用更改:“sudo service mysql restart”这将仅对所有用户禁用\u full \u group \u by。
然后再做一次查询,瞧!!,查询工作正常!!!!。
所以现在我需要在客户的每个平台(windows/linux/mac)上安装mysql之后修改my.cnf文件。
为了避免这种错误。
beq87vna2#
很少观察到:
DISTINCT
不是函数。所以你不需要用括号括起来。DISTINCT
与GROUP BY
不需要在同一列/别名上。请尝试以下操作:
af7jpaap3#
sql将连接的字符串视为不同的:
"GERARDO GARCIA RIVERA*GARG870805726" "GERARDO GARSIA RIBERA*GARG870805726" "JERARDO GARZIA RIVERA*GARG870805726"
如果您只想看到每个客户id的一个条目,您还将得到一个名称,而不是所有名称。如果显示哪一个无关紧要,那么使用min()
在上面:select if(Dealer_Name<>'', concat(min(Dealer_Name), '*',Dealer_ID), concat(Dealer_ID, '*',Dealer_ID) ) as cc from received_invoices where Customer_ID='CED130828MJ8' group by Dealer_ID order by cc asc";
注意,现在分组是由dealer\u id完成的,而不是完全串联的字符串。