2010-02-17 2 views
2

J'ai des comparaisons de tables. Si je lanceSélection de max d'une somme de deux colonnes

SELECT comparisonID,stu1Vers,stu2Vers,stu1,stu2 
    from comparisons 
    WHERE stu1!=stu2 and assignmentid=9; 

je reçois quelque chose comme:

+--------------+----------+----------+------+------+ 
| comparisonID | stu1Vers | stu2Vers | stu1 | stu2 | 
+--------------+----------+----------+------+------+ 
|   287 |  12 |  2 | 1 | 6 | 
|   286 |  12 |  1 | 1 | 6 | 
|   276 |  11 |  2 | 1 | 6 | 
|   275 |  11 |  1 | 1 | 6 | 
|   266 |  10 |  2 | 1 | 6 | 
|   265 |  10 |  1 | 1 | 6 | 
|   257 |  9 |  2 | 1 | 6 | 
|   256 |  9 |  1 | 1 | 6 | 
... 
|   391 |  19 |  1 | 1 | 6 | 
|   392 |  19 |  2 | 1 | 6 | 
+--------------+----------+----------+------+------+ 

Je voudrais sélectionner toute la ligne où stu1Vers + stu2Vers est le maximum. Je continue à essayer quelque chose le long des lignes de

select c.comparisonid,c.stu1vers,c.stu2vers,max(totvers) 
from comparisons as c join 
    (select comparisonid, stu1vers+stu2vers as totvers 
    from comparisons where stu1!=stu2 group by comparisonid) as cm 
on c.comparisonid = cm.comparisonid and c.stu1vers+c.stu2vers = cm.totvers; 

mais qui retourne un assortiment assez aléatoire des choses:

+--------------+----------+----------+--------------+ 
| comparisonid | stu1vers | stu2vers | max(totvers) | 
+--------------+----------+----------+--------------+ 
|   220 |  1 |  1 |   21 | 
+--------------+----------+----------+--------------+ 

Je suis en train de faire ramer 392 dans la première table.

+0

Renvoyez-les tous, ou juste un? Si ce dernier, lequel? –

+0

Il y a en fait deux autres colonnes dans la table, une pour chaque id de stu1 et stu2. Revenez donc tous, mais groupés par stu1 ou stu2). max (stu1vers + stu2vers) est garanti pour être unique pour n'importe quel étudiant pour n'importe quelle affectation. –

Répondre

3

Si vous voulez que toutes les lignes quand il y a plusieurs lignes avec la même valeur maximale, vous pouvez utiliser cette requête:

SELECT * FROM Table1 
WHERE stu1Vers + stu2Vers = (SELECT MAX(stu1Vers + stu2Vers) FROM Table1) 

Y compris votre condition:

SELECT * FROM Table1 
WHERE stu1Vers + stu2Vers = (
    SELECT MAX(stu1Vers + stu2Vers) 
    FROM Table1 
    WHERE stu1!=stu2 and assignmentid=9 
) AND stu1!=stu2 and assignmentid=9 

Résultat:

392, 19, 2, 1, 6 

En ce qui concerne votre mise à jour à la question, je ne suis pas sûr de ce que vous voulez dire Les lignes sont groupées par stu1 et stu2. Peut-être que vous voulez dire commandé par ces colonnes? Si c'est le cas, ajoutez ORDER BY stu1, stu2 à la requête.

1

Que diriez-vous quelque chose comme:

SELECT TOP 1 comparisonid, stu1vers, stu2vers, stu1Vers + stu2Vers AS MaxValue 
    FROM comparisons 
ORDER BY MaxValue DESC 
+0

Note: Cela ne renverra que l'un des résultats, pas tous comme demandé dans la mise à jour de la question. –

+1

Et "TOP 1" n'est pas comment vous renvoyez une ligne dans MySQL. –

0

Avez-vous essayé quelque chose comme ça? Que devrait-il se passer s'il y a plusieurs rangées avec la même valeur maximale?

SELECT comparisonID,stu1Vers,stu2Vers,stu1,stu2, max(stu1Vers + stu2Vers) as maximum 
    from comparisons 
    WHERE stu1!=stu2 and assignmentid=9 order by maximum desc limit 1; 
Questions connexes