1

为简洁起见,假设我有一个如下所示的表格:

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 为“全局”的记录?

无论如何,任何帮助表示赞赏。

编辑:我为此设置了一个 SQL Fiddle 链接

edit2:我设法使用以下查询来解决这个问题:

SELECT * FROM mytable WHERE item_location = 'local'

联盟

SELECT * FROM mytable WHERE item_name LIKE 'PROMO%' AND item_name NOT IN
(SELECT item_name from mytable WHERE item_location = 'local' )

这个 sql fiddle 链接在这里

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

4

1 回答 1

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' )

另一个使用 a 而不是子查询给出相同结果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
于 2013-03-27T22:38:24.730 回答