2017-07-05 1 views
1

J'ai deux tables - résultats et candidats. table Résultat cointainsJOIN, ORDER BY et GROUP BY dans la même déclaration

  • result_id (PK)
  • resul_contestant (qui a marqué cette)
  • valeur (combien at-il marqué)
  • result_discipline (où il a marqué cette)

participants cointains de table

  • contestant_id (PK)
  • CONTESTANT_NAME
  • contestant_category

Ce que je veux faire est de sélectionner les résultats pour tous les candidats, mais je veux seulement montrer un résultat par concurrent - le plus élevé (le plus bas) un. Jusqu'à présent, je réussi à le faire:

SELECT * FROM contenstants 
JOIN results ON result_contestant = contenstant_id 
WHERE result_discipline = 1 AND contestant_category = 1 
ORDER BY value DESC 
GROUP BY contenstant_id; 

Cependant, cela me donne erreur de syntaxe. Si je supprime la ligne GROUP BY, j'ai obtenu les résultats les plus élevés, mais si l'un des participants a marqué plus d'une fois dans cette discipline, j'ai obtenu tous ses scores.

Si je supprime la ligne ORDER BY, je n'ai qu'un seul résultat par participant, mais il renvoie le premier enregistrement en db, pas le plus élevé.

Comment faire pour que cette commande soit valide? De plus, il y a des disciplines less_is_better, où je veux le score le plus bas, mais pour autant que je puisse utiliser ORDER BY sur la requête finale, il faut le remplacer en remplaçant ASC par ASC. Merci.

+0

J'ai commencé à donner une réponse ROW_NUMER(), mais j'ai ensuite réalisé que c'était MySQL, et je ne pense pas que MySQL ait encore cette fonction. Cependant, cela devrait vous indiquer la bonne direction. Voir aussi https://dba.stackexchange.com/questions/40130/mysql-and-window-functions – Shawn

Répondre

1

N'utilisez pas group by. Utiliser select * avec group by n'a tout simplement pas de sens. Au lieu de cela, utilisez un filtre pour obtenir la ligne que vous voulez:

SELECT * 
FROM contenstants c JOIN 
    results r 
    ON r.result_contestant = c.contestant_id 
WHERE r.result_discipline = 1 AND c.contestant_category = 1 AND 
     r.value = (select min(r2.value) 
       from results r2 
       where r2.result_contestant = r.result_contestant and 
         r2.result_discipline = r.result_discipline 
       ) 
ORDER BY value DESC; 

Note: Je ne sais pas si vous voulez min() ou max() dans la sous-requête.

+0

Merci, cela a fait l'affaire. Cependant, j'ai remarqué que si un concurrent avait le même score deux fois, il est montré deux fois. Mais je pourrais prendre soin de cela en ajoutant des résultats, car il n'y a aucune raison d'avoir deux enregistrements identiques en db. –