2010-04-07 1 views
2

J'ai donc deux tables étudiants (PK sID) et mentors (PK pID). Cette requêteComment sélectionner les lignes DISTINCT sans avoir le champ ORDER BY sélectionné

SELECT s.pID 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
ORDER BY s.sID DESC; 

offre ce résultat

pID 
------------- 
9 
9 
3 
9 
3 
9 
9 
9 
10 
9 
3 
10 etc... 

Je suis en train d'obtenir une liste de mentor distincte ID de cette commande, je suis tellement cherche le SQL pour produire

pID 
------------- 
9 
3 
10 

Si J'insère simplement un DISTINCT dans la clause SELECT. J'obtiens un résultat inattendu de 10, 9, 3 (mauvais ordre). Toute aide très appréciée.

+0

J'utilise MySQL –

+2

je doute que vous voulez dire en fait à l'ordre de 9, 3, 10. Vous avez probablement d'autres critères pour la commande que vous ne nous dites pas - un nom ou date associée à s.pID peut-être? Votre code implique qu'il y a quelque chose de magique à propos de s.sID, qu'est-ce que c'est? – roufamatic

+0

Quel ordre attendez-vous lors de la commande par s.sID, par opposition à s.pID? – nos

Répondre

4
SELECT s.pID 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
GROUP BY s.pID 
ORDER BY MAX(s.sID) DESC 
+0

Brilliant!Merci beaucoup. –

4

Vous ne pouvez pas recevoir d'enregistrements dans un ordre prédéfini si vous n'utilisez pas ORDER BY car le moteur DB décide dans quel ordre les renvoyer.

+0

J'utilise ORDER BY –

1

Essayez ceci:

SELECT s.pID 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
GROUP BY s.pID 
ORDER BY s.sID DESC; 

à savoir GROUP BY au lieu de DISTINCT devrait préserver l'ordre. Après avoir utilisé "ORDER BY s.sID DESC" distinct,

+0

je le vérifie avec le groupe par ça ne fonctionne pas selon les besoins. – Salil

+0

J'ai essayé ceci avant de poster la question. Quand il n'y a pas de fonctions d'agrégation dans la clause SELECT GROUP BY fonctionne exactement comme DISTINCT selon certains commentaires d'experts sur des sujets similaires ici –

0

ne fonctionnera pas essayer si l'aide somwthing comme suit

SELECT distinct(s.pID) as PID 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
ORDER BY PID; 

Ce sera de retour >> 3, 9, 10

+0

La commande attendue est 9 3 10 –

0

Utilisez cette

SELECT DISTINCT s.pID as PID 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
ORDER BY s.sID DESC,1; 
+0

Cela donne 3,9,10 –

0

Après avoir lutté un peu plus je cette

SELECT s.pID, MAX(s.sID) AS newest_student 
FROM students s JOIN mentors m ON s.pID = m.pID 
WHERE m.tags LIKE '%a%' 
GROUP BY s.pID 
ORDER BY newest_student DESC; 

qui me donne le nécessaire 9,3,10 mais j'ai un champ inutile retourné avec elle. J'espère que quelqu'un viendra avec une meilleure solution.

Questions connexes