选择不进行重复

问题描述:

为了简洁起见,可以说我有一个表,看起来像这样:选择不进行重复

item_name item_location item_price 
PROMO_A  local   5 
B   local   7 
PROMO_A  global   8 

现在,我做的是我选择的所有记录,其中item_location是“本地”或者item_name包含字PROMOitem_location不是“本地”。这一点,在我的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 = '本地'

UNION

SELECT * FROM MYTABLE WHERE ITEM_NAME如'PROMO%'和item_name不在
(从mytable的WHERE item_location ='local'选择item_name)

而这个sql小提琴链接是here

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

+0

您是否尝试过或字段中使用DISTINCT同样的结果? – 2013-03-27 14:33:22

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 
+0

Thx,这个查询很有效,你会发现它在速度方面“更好”吗?正如我所做的似乎更容易理解。由于性能或其他问题,是否使用UNION而不提示? – Nikola 2013-03-28 16:41:54

+0

我现在已经添加了一个简化版本的'UNION'查询,它可能比原来的效率更高,但不能说它将如何与使用'LEFT JOIN'而不是子查询的查询进行比较。如果性能出现问题,您应该测试两个查询。 – 2013-03-28 21:04:38