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