使用(My)SQL中的行集并比较值

时间:2010-06-17 18:42:09

标签: sql mysql join

我试图弄清楚SQL是否对表中的记录集进行了一些相对简单的操作,但是我被卡住了。考虑一个每个项目有多行的表,所有这些都由一个公共密钥标识。

例如:

serial model color
XX1   A     blue
XX2   A     blue
XX3   A     green
XX5   B     red
XX6   B     blue
XX1   B     blue

我想要做的是:

  1. 假设所有模型A行必须具有相同的颜色,请找到不行的行。 (例如,XX3为绿色)。

  2. 假设给定的序列号只能指向单一类型的模型,请找出不会发生的行(例如XX1指向A和B)

  3. 这些都是简单的逻辑事情。要抽象它,我想知道如何使用单个键(或键组合)对事物进行分组,然后比较这些记录的值。

    我应该在同一张桌子上使用联接吗?我应该使用某种类型的数组还是类似的?

    感谢您的帮助

2 个答案:

答案 0 :(得分:3)

适用于1:

SELECT model, color, COUNT(*) AS num FROM yourTable GROUP BY model, color;

这将为您提供每个模型的列表以及该模型的每种颜色以及计数。因此,数据集的输出将为:

model color num
A     blue  2
A     green 1
B     red   1
B     blue  2

通过此输出,您可以轻松查看错误并使用UPDATE语句进行修复,或进行全面操作,为每个模型指定最常用的颜色。

2:

SELECT serial, COUNT(*) AS num FROM yourTable GROUP BY serial HAVING num > 1

这个的输出是:

serial num
XX1    2

答案 1 :(得分:0)

要解决#1问题,我会使用自联接(在同一个表上的联接,就像你所说的那样)。

例如,

select * 
from mytable
where serial in (select serial 
                 from mytable 
                 group by model, color 
                 having count(*) = 1)

会找到仅存在一种颜色的所有序列号。我没有对此进行测试,但我希望你能看到它的作用。内部选择查找仅出现一次的所有记录,然后外部选择显示这些连续出现的所有详细信息。

当然,话虽如此,这是一个糟糕的桌面设计。但我不认为这是你的问题。我希望这是一个真实情况的例子。我担心的是没有理由认为单一事件实际上是坏的 - 可能有10条记录,所有记录都有不同的颜色。这种方法会告诉你所有这些都是错的,你将无法确定哪个是正确的。