查找带有下表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。 如果行中的所有内容第一次出现,我只想返回行。
答案 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
但你应该知道风险:
ORDER BY
并不是真正有效的,通常也不会有效。引擎可以跳过它或将其移动到外部查询。
如果在一个语句中读取和写入相同的会话变量,则不会定义执行顺序。因此查询可能不适用于所有(未来)版本。