MySQL 触发器嵌套 Group_Concat 重复
Posted
技术标签:
【中文标题】MySQL 触发器嵌套 Group_Concat 重复【英文标题】:MySQL Trigger Nested Group_Concat Duplicates 【发布时间】:2021-07-10 20:49:32 【问题描述】:我有一个触发器来有条件地 GROUP_CONCAT 几列。我可以从单个列中删除重复项,但我很难删除两列或更多列之间的重复项。
当前触发器(两列示例):
CREATE TRIGGER trigger1
BEFORE UPDATE
ON Table1
FOR EACH ROW
BEGIN
set NEW.results =
(SELECT (GROUP_CONCAT(distinct (CONCAT_WS('<br>',
(SELECT (GROUP_CONCAT(distinct stocks1 SEPARATOR '<br>'))
FROM Table2
where NEW.selection1 = 'x'),
(SELECT (GROUP_CONCAT(distinct stocks2 SEPARATOR '<br>'))
FROM Table2
where NEW.selection2 = 'x')
)))));
end;
小提琴:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=46a6bb915fa7e2e9106b073677eee6cd
【问题讨论】:
你能不能多解释一下你想得到什么,样本真的没有说清楚 @nbk。我想将两列合并为一行而没有重复。在我的小提琴中,它将删除单个列、stocks1 或stock2 的重复项,但不会删除stock1 和stock2 之间的重复项。如果stocks1 和stocks2 都有“BRK”,我只想在结果中看到一次,而不是两次。 【参考方案1】:将第二个 Select 改为
✓ ✓ 编号 |选择1 |选择2 |结果 -: | :--------- | :--------- | :------ 1 | 空 | 空 | 空 2 | 空 | 空 | 空 3 | 空 | 空 | 空-- Table1 CREATE TABLE Table1 (id INT,selection1 varchar(50),selection2 varchar(50),results varchar(1000)); INSERT INTO Table1 (id,selection1,selection2,results) VALUES (1,null,null,null), (2,null,null,null), (3,null,null,null); select * from Table1
✓ ✓ 股票1 |股票2 :-------- | :------ 刹车 |谷歌 国际贸易中心 | NKE 特斯拉 |应用程序 应用 | NKE 特斯拉 |脸书 NKE | BRK-- Table2 CREATE TABLE Table2 (stocks1 VARCHAR(50),stocks2 VARCHAR(50)); INSERT INTO Table2 (stocks1,stocks2) VALUES -- ('BRK','BRK'), -- ('BRK','BRK'); ('BRK','GOOG'), ('INTC','NKE'), ('TSLA','APPL'), ('APPL','NKE'), ('TSLA','FB'), ('NKE','BRK'); select * from Table2
CREATE TRIGGER trigger1 BEFORE UPDATE ON Table1 FOR EACH ROW BEGIN set NEW.results = (SELECT CONCAT('<br>',GROUP_CONCAT( val SEPARATOR '<br>')) FROM (SELECT stocks1 as val FROM Table2 WHERE NEW.selection2 = 'x' UNION SELECT stocks2 FROM Table2 WHERE NEW.selection2 = 'x') t1 ); end;
update Table1 set selection1 = 'x', selection2 = 'x' where id = 1
编号 |选择1 |选择2 |结果 -: | :--------- | :--------- | :------------------------------------------------ -- 1 | x | x | BRKINTCTSLAAPPLNKEGOOGFB 2 | 空 | 空 | 空 3 | 空 | 空 | 空select * from Table1
db小提琴here
【讨论】:
那行得通。如果有更多的列,我想我只需要继续添加比较? 是的,我考虑了更多列,并会为所有其他应该保持代码简单的列编写一个 IN (SELECT stock1...UNION SELECT stock2 ....) 你有什么例子吗? 确定dbfiddle.uk/… 太好了!谢谢!以上是关于MySQL 触发器嵌套 Group_Concat 重复的主要内容,如果未能解决你的问题,请参考以下文章
Sqlite Query, Group_Concat 的多个左连接和嵌套查询