在MySQL中的2列中查找重复值

时间:2014-04-02 16:51:39

标签: mysql sql

标题并不严格准确:我不是只是试图找到“重复”的记录;我正在尝试查找一列中具有重复值的所有记录,但前提是所有这些记录在另一列中都有重复值。

作为一个现实世界的问题,它的措辞如下:我想要一个所有项目的列表,其中每个项目的大小都具有相同的状态代码。

一些示例数据:

catalog_items

id, name
 0, Gloves
 1, Spade
 2, Seed

catalog_sizes

id, f_id,  size, price, status
 0,    0, small,     1,  oos
 1,    0,   med,     2,  oos
 2,    0, large,     3,
 3,    1,   one,    12,  oos
 4,    1,   two,    20,  oos
 5,    2,   1oz,    10,  bo
 6,    2,   1lb,   100,  bo

(请注意,id 2 又名大手套不是oos,而是两个较小的尺寸。)在我们的实际数据中,所有项目的尺寸至少为1,而且大多数都有3-5个。此外,我们的数据集永远不会超过10,000条记录。

这个结束了:

SELECT f_id, status
FROM catalog_sizes 
WHERE status != ''
GROUP BY f_id, status

但不正确,因为它还会返回某些大小且具有重复状态的项目的记录。 (例如f_id 0有两种状态为oos的尺寸)我需要获取所有尺寸具有相同状态的项目列表。鉴于catalog_sizes中的示例数据,我想要的输出是:

f_id, status
   1,  oos
   2,  bo

最好的方法是什么?可以在一个查询中完成吗?

2 个答案:

答案 0 :(得分:3)

我相信以下内容应该有效:

select ci.name, cs.f_id, MIN(cs.status) AS status
from catalog_items ci join catalog_sizes cs on ci.id = cs.f_id
group by ci.name, cs.f_id
having max(cs.status) = min(cs.status);

请知道这是否有帮助!

答案 1 :(得分:1)

此查询应该执行您想要的操作。它比较最高和最低字符串(以查看它们是否不同)如果为真,则返回0,因此当它仅为0时,它将出现在查询中。 见工作FIDDLE

SELECT f_id, status, COUNT(id)
FROM catalog_sizes
GROUP BY f_id
HAVING STRCMP(MIN(status), MAX(status)) = 0