Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL的2列中查找重复值_Mysql_Sql - Fatal编程技术网

在MySQL的2列中查找重复值

在MySQL的2列中查找重复值,mysql,sql,Mysql,Sql,标题并不是严格意义上的准确:我不仅仅是想找到“重复”的记录;我试图找到在一列中有重复值的所有记录,但前提是所有这些记录在另一列中也有重复值 作为一个现实问题,它的措辞是这样的:我想要一个所有项目的列表,每个项目的大小都有相同的状态代码 一些示例数据: 表目录项目 id, name 0, Gloves 1, Spade 2, Seed 表目录大小 id, f_id, size, price, status 0, 0, small, 1, oos 1, 0,

标题并不是严格意义上的准确:我不仅仅是想找到“重复”的记录;我试图找到在一列中有重复值的所有记录,但前提是所有这些记录在另一列中也有重复值

作为一个现实问题,它的措辞是这样的:我想要一个所有项目的列表,每个项目的大小都有相同的状态代码

一些示例数据:

目录项目

id, name
 0, Gloves
 1, Spade
 2, Seed
目录大小

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 aka大手套不像两个小尺寸的手套那样是
oos
)在我们的实际数据中,所有物品都至少有一个尺寸,大多数都有3-5个尺寸。此外,我们的数据集永远不会超过10000条记录

这很接近:

SELECT f_id, status
FROM catalog_sizes 
WHERE status != ''
GROUP BY f_id, status
但这是不正确的,因为它还返回具有重复状态的某些大小的项目的记录。(例如,
f_id
0有两种大小,状态为
oos
)我需要获取所有大小都具有相同状态的项目列表。给定
目录_size
中的示例数据,我希望的输出是:

f_id, status
   1,  oos
   2,  bo

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

我认为以下方法应该有效:

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

让我知道这是否有用

我认为以下方法应该有效:

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

让我知道这是否有用

此查询应满足您的要求。它比较最高和最低的字符串(看看它们是否不同),如果为true,则返回0,因此当其仅为0时,它将显示在查询中。 见工作


此查询应满足您的要求。它比较最高和最低的字符串(看看它们是否不同),如果为true,则返回0,因此当其仅为0时,它将显示在查询中。 见工作



您是按id分组还是按f_id分组?您的数据显示,所有的f_id都有一个以上的大小。我不明白为什么应该返回
1
2
,而不是
0
。。。或者按状态排序的具有相同值的f\u id的计数。@可以编辑SQL以正确地
按f\u id分组。另外,
id
3的
f\u id
0和
status
与其他两个大小不同。因此,您正在进行计数(*)以计算状态出现的次数?您是按id进行分组还是按f\u id进行分组?您的数据显示,所有
f\u id
都有一个以上的大小。我不明白为什么应该返回
1
2
,而不是
0
。。。或者按状态排序的具有相同值的f\u id的计数。@可以编辑SQL以正确地
按f\u id分组。另外,
id
3的
f\u id
0和
status
与其他两个尺寸不同。因此,您正在进行计数(*)以计算状态出现的次数?我没有复制您所做的。我在编小提琴,写了一个问题?我的意思是你做了,但我已经看过很多这样的内容,所以我不怪你…我的查询几乎和OP的查询一样,只是因为你的查询与我的相似,并不意味着我复制了它。。我已经用过很多次了。谢谢@JohnRuddell。如果没有您的解释,我不可能理解MIN/MAX调用之间的概念。如果列表中有多个差异值,则列表的MAX永远不会与MIN相同。如果只有一个值,max和min总是一样的。我并不是照搬你的做法。我在编小提琴,写了一个问题?我的意思是你做了,但我已经看过很多这样的内容,所以我不怪你…我的查询几乎和OP的查询一样,只是因为你的查询与我的相似,并不意味着我复制了它。。我已经用过很多次了。谢谢@JohnRuddell。如果没有您的解释,我不可能理解MIN/MAX调用之间的概念。如果列表中有多个差异值,则列表的MAX永远不会与MIN相同。如果只有一个值+1,max将始终与min相同,因为如果有索引可供使用,这可能是最有效的方法。
HAVING COUNT(DISTINCT status)=1也可以,但效率不高。啊,对了,我的方法在MySQL中应该仍然可以正常工作,因为它允许您选择一个不需要聚合的非分组列,但是感谢@ypercube的编辑,因为它使SQL语句更加通用@它还可以在任何MySQL设置下工作。+1因为如果有索引可以使用,它可能是最有效的方法。
HAVING COUNT(DISTINCT status)=1也可以,但效率不高。啊,对了,我的方法在MySQL中应该仍然可以正常工作,因为它允许您选择一个不需要聚合的非分组列,但是感谢@ypercube的编辑,因为它使SQL语句更加通用@SS781还可以在任何MySQL设置下工作。