为了简洁起见,我可以说我的表格如下:
item_name item_location item_price
PROMO_A local 5
B local 7
PROMO_A global 8
现在,我正在做的是选择所有记录,其中item_location是'local'或item_name
包含单词PROMO
,但item_location
不是'local' 。在我的SQL查询中,这看起来很简单:
SELECT * FROM mytable WHERE item_location='local' OR (item_name like 'PROMO%' AND item_location != 'local');
现在,它可能会发生,就像我上面设置的示例数据一样,我会得到两个相同的item_name
,所以我想知道如何修复此查询,以便后者不会不加?我可以通过编写一个PHP程序来解决这个问题,该程序将遍历记录并删除重复项(我需要删除具有item_location =='global'的重复项(具有相同item_name的那些))但我想知道这是否可以只使用SQL完成?我正在考虑制作上述查询的临时表,然后查询不同的item_name记录,但是在那种情况下我将如何删除具有item_location'global'的那些?
无论如何,任何帮助都表示赞赏。
编辑:我已经设置了SQL Fiddle link for this。
edit2:我设法使用以下查询:
SELECT * FROM mytable WHERE item_location ='local'
UNION
SELECT * FROM mytable WHERE item_name LIKE'PROMO%'和item_name NOT IN
(从mytable WHERE item_location ='local'中选择item_name)
这个sql小提琴链接是here。
现在,我相信这可以更好地处理,所以如果有人有更好的方法,我想听听你的想法。
答案 0 :(得分:1)
您的UNION
查询可能会简化为
SELECT * FROM mytable
WHERE item_location = 'local'
OR item_name LIKE 'PROMO%' AND item_name NOT IN
(SELECT item_name FROM mytable
WHERE item_location = 'local' )
使用LEFT JOIN
而不是子查询提供相同结果的另一个查询是
SELECT mt.* FROM mytable AS mt
LEFT JOIN mytable as mt2
ON mt2.item_name = mt.item_name -- check for similar items
AND mt2.item_location = 'local' -- whose location is 'local'
WHERE mt.item_location = 'local'
OR mt.item_name LIKE 'PROMO%'
AND mt2.item_location IS NULL; -- only include if not found locally