查询2列,其中值永远不会出现在任一列中

时间:2017-02-20 22:09:23

标签: mysql sql

查找带有下表ProductList

的查询
id| column_1  | column_2  | Sum  
================================  
1 | Product-A | Product-B |  67 
2 | Product-A | Product-C |  55 
3 | Product-A | Product-D |  23 
4 | Product-B | Product-C |  95 
5 | Product-C | Product-D | 110 

并返回第一个记录Product-A_Product-B,然后在任一列中跳过包含Product-A或Product-B的所有记录,并返回Product-C_Product-D。 如果行中的所有内容第一次出现,我只想返回行。

1 个答案:

答案 0 :(得分:0)

假设产品不包含,,您可以使用逗号分隔的会话变量来存储已选择的产品,如果其中一个列已包含在该变量中,则检查每一行:

select column_1, column_2
from (
    select l.*,
        case when find_in_set(l.column_1, @products) or find_in_set(l.column_2, @products)
          then 1
          else (@products := concat(@products, ',', l.column_1, ',', l.column_2)) = ''
        end as skip
    from ProductList l
    cross join (select @products := '') init
    order by l.id
) t
where skip = 0;

演示:http://rextester.com/NDVBW87988

但你应该知道风险:

    子查询中的
  1. ORDER BY并不是真正有效的,通常也不会有效。引擎可以跳过它或将其移动到外部查询。

  2. 如果在一个语句中读取和写入相同的会话变量,则不会定义执行顺序。因此查询可能不适用于所有(未来)版本。