选择不重复

时间:2013-03-27 14:28:53

标签: mysql

为了简洁起见,我可以说我的表格如下:

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

现在,我相信这可以更好地处理,所以如果有人有更好的方法,我想听听你的想法。

1 个答案:

答案 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