2010-02-08 92 views
1

有了这个表:选择行 - 唯一的字段作为条件

Row Pos  Outdata Mismatch   Other 
1  10  S   0    A 
2  10  S   5    A 
3  10  R   0    B 
4  10  R   7    B 
5  20  24   0    A 
6  20  24   5    B 
6  20  32   10    C 

如何选择若pos = 10,它具有独特的Outdata所有行。如果不止一行存在,我希望将字段不匹配最小的那一行。即我想获得行1和3,而不是2和4.

在该选择我也想对所有Pos = 20做同样的事情,所以总的结果应该是行1,3,5, 6

(我想然后访问“其他”字段,所以我不能只对选定的DISTINCT Pos和OutData和不匹配)。

是否有查询在MySQL中执行此操作?

+0

第6行复制错误?我们可以假设(Pos,Outdata,Mismatch)是独一无二的吗? – 2010-02-08 22:23:10

+1

桌子的名字是什么?如果表的名称已经正确,可以帮助您测试查询,以避免在修改查询时发生键入错误。 – 2010-02-08 22:33:34

+0

啊,对不起,最后一行是#7和tabel是“代码” – 2010-02-10 11:13:39

回答

1

理由是创建POS,OutData的所有值和最低不匹配的表,并使用这些字段的组合作为唯一密钥到您实际的表。

SELECT t1.* 
FROM  MyTable t1 
      INNER JOIN (
      SELECT Pos, OutData, Mismatch = MIN(Mismatch) 
      FROM  MyTable 
      GROUP BY Pos, OutData 
     ) t2 ON t2.Pos = t1.Pos 
        AND t2.OutData = t1.OutData 
        AND t2.Mismatch = t1.Mismatch 
+0

谢谢大家,会尝试并思考所有答案! – 2010-02-10 11:17:12

+0

这工作正常与一些额外的WHERE为t2和AND与t1后相同的条件下的t1! – 2010-02-10 21:35:25

1

试试这个:

Select * From Table ot 
Where pos = 10 
    And MisMatch = 
     (Select Min(MisMatch) From Table 
     Where pos = 10 
      And Outdata = ot.OutData) 
+0

嗯......有一些方法可以从子查询中删除依赖项吗?对于外部结果集中的每一行,都必须运行一次从属子查询,在这种情况下,对于表中的每一行都应该运行一次。 – Powerlord 2010-02-08 15:33:57

+0

不是我所知道的,你想限制查询仅限于那些不匹配是具有相同OutData的那组行最低不匹配的行。这意味着两个构造(不匹配值和具有相同OutData值的行集合)之间的关联。无论您使用子查询还是某种类型的连接,都必须处理该关联以生成正确的输出行 – 2010-02-08 15:55:30

+0

谢谢大家,将会尝试并思考所有答案! – 2010-02-10 11:16:51

0

这应该为你工作:

SELECT * 
FROM table T1 
GROUP BY Pos, Outdata 
HAVING Mismatch = (
    SELECT MIN(Mismatch) 
    FROM table T2 
    WHERE Pos = T1.Pos AND 
    Outdata = T1.Outdata 
) 
+0

谢谢大家,会尝试并思考所有的答案! – 2010-02-10 11:16:05

+0

GROUP BY后不起作用。 – 2010-02-10 21:38:52

+0

它确实有效。如果您没有“GROUP BY”,则它不起作用。 – RaYell 2010-02-12 10:03:06

2

在这里,我假设(POS,OutData,错配)是唯一的,但(行,POS,OutData,不匹配)独特:

SELECT T3.* 
FROM Codes T3 
JOIN (
    SELECT MIN(Row) AS Row 
    FROM (
     SELECT Pos, OutData, Min(Mismatch) AS Mismatch 
     FROM Codes 
     GROUP BY Pos, OutData 
    ) T1 
    JOIN Codes T2 
    ON T1.Pos = T2.Pos AND T2.OutData = T2.Outdata AND T1.Mismatch = T2.Mismatch 
    GROUP BY T2.Pos, T2.OutData, T2.Mismatch 
) T4 
ON T3.Row = T4.Row 

结果:

1, 10, 'S', 0, 'A' 
3, 10, 'R', 0, 'B' 
5, 20, '24', 0, 'A' 
7, 20, '32', 10, 'C' 

请注意,我也纠正了第二行6成为第7行,因为我认为这是一个错误的问题。

+0

谢谢!将检查此并返回! – 2010-02-10 11:14:59

+0

从来没有尝试过,但它看起来不错。接受另一种解决方案,但感谢您的努力! – 2010-02-10 21:36:55

+0

@Petter:您接受的解决方案假定(Pos,OutData,Mismatch)**是**唯一的。如果情况总是如此,那么该解决方案是最好的 - 鉴于两种解决方案都可行,请选择更简单的解决方案。但是,如果这种假设并非总是如此,那么您接受的解决方案将失败(它将针对相同的Pos,OutData返回多行)。既然你没有说明你的假设,我不知道要做出什么假设,所以我玩得很安全:制作一个稍微复杂一点的解决方案,总是有效的。 – 2010-02-10 21:55:59