选择行 - 唯一的字段作为条件
有了这个表:选择行 - 唯一的字段作为条件
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中执行此操作?
理由是创建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
谢谢大家,会尝试并思考所有答案! – 2010-02-10 11:17:12
这工作正常与一些额外的WHERE为t2和AND与t1后相同的条件下的t1! – 2010-02-10 21:35:25
试试这个:
Select * From Table ot
Where pos = 10
And MisMatch =
(Select Min(MisMatch) From Table
Where pos = 10
And Outdata = ot.OutData)
嗯......有一些方法可以从子查询中删除依赖项吗?对于外部结果集中的每一行,都必须运行一次从属子查询,在这种情况下,对于表中的每一行都应该运行一次。 – Powerlord 2010-02-08 15:33:57
不是我所知道的,你想限制查询仅限于那些不匹配是具有相同OutData的那组行最低不匹配的行。这意味着两个构造(不匹配值和具有相同OutData值的行集合)之间的关联。无论您使用子查询还是某种类型的连接,都必须处理该关联以生成正确的输出行 – 2010-02-08 15:55:30
谢谢大家,将会尝试并思考所有答案! – 2010-02-10 11:16:51
这应该为你工作:
SELECT *
FROM table T1
GROUP BY Pos, Outdata
HAVING Mismatch = (
SELECT MIN(Mismatch)
FROM table T2
WHERE Pos = T1.Pos AND
Outdata = T1.Outdata
)
谢谢大家,会尝试并思考所有的答案! – 2010-02-10 11:16:05
GROUP BY后不起作用。 – 2010-02-10 21:38:52
它确实有效。如果您没有“GROUP BY”,则它不起作用。 – RaYell 2010-02-12 10:03:06
在这里,我假设(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行,因为我认为这是一个错误的问题。
谢谢!将检查此并返回! – 2010-02-10 11:14:59
从来没有尝试过,但它看起来不错。接受另一种解决方案,但感谢您的努力! – 2010-02-10 21:36:55
@Petter:您接受的解决方案假定(Pos,OutData,Mismatch)**是**唯一的。如果情况总是如此,那么该解决方案是最好的 - 鉴于两种解决方案都可行,请选择更简单的解决方案。但是,如果这种假设并非总是如此,那么您接受的解决方案将失败(它将针对相同的Pos,OutData返回多行)。既然你没有说明你的假设,我不知道要做出什么假设,所以我玩得很安全:制作一个稍微复杂一点的解决方案,总是有效的。 – 2010-02-10 21:55:59
第6行复制错误?我们可以假设(Pos,Outdata,Mismatch)是独一无二的吗? – 2010-02-08 22:23:10
桌子的名字是什么?如果表的名称已经正确,可以帮助您测试查询,以避免在修改查询时发生键入错误。 – 2010-02-08 22:33:34
啊,对不起,最后一行是#7和tabel是“代码” – 2010-02-10 11:13:39