有一个非常具体的实际情况让我陷入了一个非常具体的MySQL查询问题。我想知道它是否可以在MySQL中完成。
如果我在MySQL数据库中有两列带有CSV值的列。它们代表了一组数字。我想知道我是否可以在查询中“减去”另一组中的一组。
例如,如果A="100, 234, 567, 890"
和B="100, 123, 567"
,我想从A中删除B中的所有值;屈服"234, 890"
。所以我想只删除A和B中存在的A中的值。值是数字但csv显然是字符串。如有必要,两个csv值都可以按升序排列。
(实际的csv用逗号分隔但没有空格,为了便于阅读,我在这里只添加了空格。)
我知道csv值通常不是可行的方法,但在这种特定情况下它无法帮助。
有一个简单而优雅的解决方案吗?
编辑:如果A中的值的数量被限制(在这种情况下最多为6),我只能使它工作,既不简单也不优雅:
SET @A='1,2,3,4,5';
SET @B='1,3,5,6,8';
SELECT CONCAT_WS(',',
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 1 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',1 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',1 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 2 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',2 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',2 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 3 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',3 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',3 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 4 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',4 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',4 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 5 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',5 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',5 ),',',-1),NULL),
IF( LENGTH(@A)-LENGTH(REPLACE(@A,',','')) + 1 >= 6 AND NOT FIND_IN_SET(SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',6 ), ',', -1 ),@B),SUBSTRING_INDEX( SUBSTRING_INDEX( @A, ',',6 ),',',-1),NULL))
结果:
2,4
可能通过定义一个函数(并在之后删除它们),这可能会更具可读性。
有更好的解决方案吗?