如何在mysql表中选择id所在的不同名称,防止重复记录

aelbi1ox  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(261)

我有一个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"

我遗漏了什么?你有什么建议?
提前谢谢

1hdlvixo

1hdlvixo1#

很少观察到: DISTINCT 不是函数。所以你不需要用括号括起来。 DISTINCTGROUP BY 不需要在同一列/别名上。
请尝试以下操作:

SELECT 
  CONCAT(IF(MAX(Dealer_Name) <> '', MAX(Dealer_Name), Dealer_ID), 
         '*', 
         Dealer_ID
        ) AS cc 
FROM received_invoices 
WHERE Customer_ID = 'CED130828MJ8' 
GROUP BY Dealer_ID 
ORDER BY cc ASC
ctzwtxfj

ctzwtxfj2#

@madhur bhaiya。
首先,感谢您的关注,您的伟大,正如您所说,这就是答案:

SELECT 
  CONCAT(IF(MAX(Dealer_Name) <> '', MAX(Dealer_Name), Dealer_ID), 
         '*', 
         Dealer_ID
        ) AS cc 
FROM received_invoices 
WHERE Customer_ID = 'CED130828MJ8' 
GROUP BY Dealer_ID 
ORDER BY cc ASC

在我的特定情况下,可能不在其他人中,当我执行该查询时,它会抛出错误:错误代码: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文件。
为了避免这种错误。

cnjp1d6j

cnjp1d6j3#

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完成的,而不是完全串联的字符串。

相关问题