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 改为

-- 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 |结果 -: | :--------- | :--------- | :------ 1 | | | 2 | | | 3 | | |
-- 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
✓ ✓ 股票1 |股票2 :-------- | :------ 刹车 |谷歌 国际贸易中心 | NKE 特斯拉 |应用程序 应用 | NKE 特斯拉 |脸书 NKE | BRK
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
select * from Table1
编号 |选择1 |选择2 |结果 -: | :--------- | :--------- | :------------------------------------------------ -- 1 | x | x | BRKINTCTSLAAPPLNKEGOOGFB 2 | | | 3 | | |

db小提琴here

【讨论】:

那行得通。如果有更多的列,我想我只需要继续添加比较? 是的,我考虑了更多列,并会为所有其他应该保持代码简单的列编写一个 IN (SELECT stock1...UNION SELECT stock2 ....) 你有什么例子吗? 确定dbfiddle.uk/… 太好了!谢谢!

以上是关于MySQL 触发器嵌套 Group_Concat 重复的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mySQL 中使用嵌套案例?

Sqlite Query, Group_Concat 的多个左连接和嵌套查询

mysql刷题笔记

解决mysql中group_concat长度限制的方案

嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

mysql 的group_concat方法