选择不进行重复
为了简洁起见,可以说我有一个表,看起来像这样:选择不进行重复
item_name item_location item_price
PROMO_A local 5
B local 7
PROMO_A global 8
现在,我做的是我选择的所有记录,其中item_location是“本地”或者item_name
包含字PROMO
但item_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。
现在,我相信这可以以更好的方式处理,所以如果有人有更好的方法,我想听听你的想法。
你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
Thx,这个查询很有效,你会发现它在速度方面“更好”吗?正如我所做的似乎更容易理解。由于性能或其他问题,是否使用UNION而不提示? – Nikola 2013-03-28 16:41:54
我现在已经添加了一个简化版本的'UNION'查询,它可能比原来的效率更高,但不能说它将如何与使用'LEFT JOIN'而不是子查询的查询进行比较。如果性能出现问题,您应该测试两个查询。 – 2013-03-28 21:04:38
您是否尝试过或字段中使用DISTINCT同样的结果? – 2013-03-27 14:33:22