Sql 选择最多两列(重新访问)
我问了一个类似的问题,后来才发现我认为答案是无效的,因为我没有提出正确的问题,也没有注意到回答者告诉我这一点。再次回顾一下,我有一个比较表。我试图为每组两名学生选择具有最大版本的行。所以我一直在做:Sql 选择最多两列(重新访问),sql,mysql,Sql,Mysql,我问了一个类似的问题,后来才发现我认为答案是无效的,因为我没有提出正确的问题,也没有注意到回答者告诉我这一点。再次回顾一下,我有一个比较表。我试图为每组两名学生选择具有最大版本的行。所以我一直在做: SELECT subID1, subID2, stu1,stu2,comparisonID,MAX(stu1vers+stu2vers) AS maxvers FROM comparisons WHERE assignmentID=9 AND stu1!=stu2 GROUP BY stu1,s
SELECT subID1, subID2, stu1,stu2,comparisonID,MAX(stu1vers+stu2vers) AS maxvers
FROM comparisons
WHERE assignmentID=9 AND stu1!=stu2
GROUP BY stu1,stu2;
+--------+--------+------+------+--------------+---------+
| subID1 | subID2 | stu1 | stu2 | comparisonID | maxvers |
+--------+--------+------+------+--------------+---------+
| 15 | 11 | 1 | 6 | 64 | 6 |
| 11 | 3 | 6 | 1 | 55 | 5 |
+--------+--------+------+------+--------------+---------+
不行,因为我只需要maxvers 6岁的那一排。我上次得到的答案是:
SELECT subID1,subID2,stu1,stu2, comparisonID
FROM comparisons WHERE stu1Vers + stu2Vers = (
SELECT MAX(stu1Vers+stu2Vers)
FROM comparisons
WHERE stu1 != stu2 AND assignmentid=9
) AND stu1!=stu2 AND assignmentid=9
GROUP BY stu1,stu2;
我真的认为这是有效的——结果发现它在表中查询该赋值的最大版本,然后查找与该最大版本匹配的行。但这并不好,因为两个学生的版本号可能更低:
+--------+--------+------+------+--------------+---------+
| subID1 | subID2 | stu1 | stu2 | comparisonID | maxvers |
+--------+--------+------+------+--------------+---------+
| 44 | 23 | 37 | 36 | 153 | 2 |
| 44 | 36 | 37 | 39 | 156 | 3 |
| 44 | 34 | 37 | 40 | 154 | 3 |
| 36 | 23 | 39 | 36 | 95 | 3 |
| 36 | 34 | 39 | 40 | 96 | 4 |
...
+--------+--------+------+------+--------------+---------+
在那里,我需要选择所有这些记录,因为stu1和stu2的每个组合都是唯一的。如何计算每种stu1、stu2组合的maxsub1vers+sub2vers行,也就是说,在上面的第一个表中,我仍然需要比较64 编辑特定于MySQL的查询将为非聚合列生成不正确的值。请改用可移植查询
假设您基于问题的标记和原始SQL查询在MySQL下运行,那么您可以发出以下语句:
SELECT subID1, subID2,stu1,stu2,comparisonID,MAX(stu1vers+stu2vers) AS maxvers
FROM comparisons
WHERE assignmentID=9 AND stu1!=stu2
GROUP BY LEAST(stu1,stu2), GREATEST(stu1,stu2);
如果您需要更好的可移植性,并且能够在例如Postgres上发出查询,那么您需要一个稍微复杂一点的查询,这里使用单个连接:
选择subID1、subID2、stu1、stu2、comparisonID、MAXstu1vers+stu2vers作为maxvers
比较
其中assignmentID=9和stu1=斯图2
stu1、stu2分组
按MAXstu1vers+stu2vers DESC订购
限制1
还是我想错了?很抱歉,上次你问我的问题我没听懂。这个怎么样:
SELECT
subID1,
subID2,
T3.stu1,
T3.stu2,
comparisonID,
stu1vers + stu2vers AS maxvers
FROM (
SELECT assignmentId, stu1, stu2, MAX(vers) AS maxvers
FROM (
SELECT
assignmentId,
stu1vers + stu2vers AS vers,
LEAST(stu1, stu2) AS stu1,
GREATEST(stu1, stu2) AS stu2
FROM comparisons
WHERE stu1 <> stu2) AS T1
GROUP BY assignmentId, stu1, stu2
) AS T2
JOIN comparisons AS T3
ON T2.stu1 = LEAST(T3.stu1, T3.stu2)
AND T2.stu2 = GREATEST(T3.stu1, T3.stu2)
AND T2.maxvers = T3.stu1vers + T3.stu2vers
AND T2.assignmentId = T3.assignmentId
WHERE T3.assignmentId = 9
这将按stu1和stu2分组以查找最大版本,self将与比较表联接以获取对应行的其余列。stu1和stu2的顺序被认为是不相关的。不幸的是,我需要选择多行,所以这不起作用。这不起作用有两个原因。它不会忽略stu1和stu2的顺序。2它的问题与Vlad的第一个建议相同:在某些情况下,它返回错误的比较ID。这两个查询实际上给出了不同的结果。上面的那个给了我正确的maxstu1vers+stu2vers,但是比较错误。下面的建议看起来是对的。是的,第一个建议行不通。如果在order by中未包含字段,则获得的值可以是任何行的值,而不一定是最大行的值。您的意思是在“group by”中:
+--------+--------+------+------+--------------+---------+
| subID1 | subID2 | stu1 | stu2 | comparisonID | maxvers |
+--------+--------+------+------+--------------+---------+
| 15 | 11 | 1 | 6 | 64 | 6 |
| 11 | 3 | 6 | 1 | 55 | 6 |
+--------+--------+------+------+--------------+---------+
SELECT
subID1,
subID2,
T3.stu1,
T3.stu2,
comparisonID,
stu1vers + stu2vers AS maxvers
FROM (
SELECT assignmentId, stu1, stu2, MAX(vers) AS maxvers
FROM (
SELECT
assignmentId,
stu1vers + stu2vers AS vers,
LEAST(stu1, stu2) AS stu1,
GREATEST(stu1, stu2) AS stu2
FROM comparisons
WHERE stu1 <> stu2) AS T1
GROUP BY assignmentId, stu1, stu2
) AS T2
JOIN comparisons AS T3
ON T2.stu1 = LEAST(T3.stu1, T3.stu2)
AND T2.stu2 = GREATEST(T3.stu1, T3.stu2)
AND T2.maxvers = T3.stu1vers + T3.stu2vers
AND T2.assignmentId = T3.assignmentId
WHERE T3.assignmentId = 9