2010-03-02 5 views
11

Pour autant que je sache groupes mysql groupe par le dernier enregistrement trouvé.GROUP BY retourner le premier enregistrement

Existe-t-il une solution à GROUP BY le premier enregistrement?

J'ai configuré la commande ORDER dans SQL et j'ai besoin de GROUP BY retourner le premier enregistrement et pas le dernier.

EDIT

est ici de la requête

SELECT 
    DISTINCT(master.masterID), 
    langData.*, 
    master.* 
FROM master_table as master 
INNER JOIN lang_table as langData ON 
langData.masterID=master.masterID 
GROUP BY master.masterID 
ORDER BY 
CASE 
    WHEN langData.lang='currentLang' THEN 1 ELSE 999 END , 
    master.name desc LIMIT 0,10 

La requête sélectionner au-dessus du masterID pour la table en plusieurs langues et supposons pour revenir d'abord les dossiers dans currentLang et les commandez par nom, puis tous les autres langues.

Ne me demandez pas pourquoi je ne définis pas la langue dans JOIN. C'est la voie à suivre.

Donc tout fonctionne bien jusqu'à présent, attendez le scénario que j'ai un enregistrement avec les langues en et fr. Si currentLang est en alors basé sur

langData.lang='currentLang' THEN 1 ELSE 999 END 

l'ordre en est 1 et fr ordre est 999 et au lieu d'obtenir la valeur de en je reçois la valeur de fr.

C'est pourquoi je veux regrouper à la première rangée.

+0

Je ne vais pas vous demander pourquoi vous ne définissez pas la langue dans le 'JOIN' Je vais vous dire que ça ne marchera pas. Une expression non agrégée dans 'GROUP BY' renvoie un enregistrement arbitraire de chaque groupe et n'est pas supposée être utilisée si les valeurs varient. Vous pouvez retourner n'importe quel enregistrement de 'master_table' (ils seront tous les mêmes dans chaque groupe) mais pas de' lang_table'. Il n'y a aucune garantie sur quel enregistrement sera retourné, nada, niente. 'BTW', pourquoi avez-vous' DISTINCT' ici, quel est son but? – Quassnoi

+0

J'essaye d'obtenir "donnez-moi d'abord tous les enregistrements de l'ordre de langue courant par nom et ensuite pour toutes les autres langues par nom" Signification: si lang actuel est EN alors obtenir tous les enregistrements pour EN puis obtenir tous les enregistrements pour d'autres langues. SI dans la table lang pour un enregistrement a EN, FR retourner la valeur EN.IF dans la table lang FR n'existe pas retourner tout autre lang – ntan

+0

c'est très facile à faire avec un 'JOIN' comme décrit ici: http: // explainextended. com/2009/08/10/fallback-language-names-mysql/mais pour une raison étrange (que vous ne voulez même pas être demandé) vous êtes réticent à l'utiliser. – Quassnoi

Répondre

11

Je suppose que vous parlez de quelque chose comme

SELECT * 
FROM mytable 
GROUP BY 
     column 

Vous ne devriez pas utiliser des expressions non agrégées dans GROUP BY à moins qu'ils ne sont même au sein du groupe.

Si vous voulez retourner le dossier tenant la moindre valeur d'une expression au sein d'un groupe, utilisez ceci:

SELECT mo.* 
FROM (
     SELECT DISTINCT column 
     FROM mytable 
     ) md 
JOIN mytable mo 
ON  mo.id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.column = md.column 
     ORDER BY 
       mi.column, mi.someorder 
     LIMIT 1 
     ) 
1

Ajouter LIMIT 1 à votre requête.

+0

impossible. Enregistrement de lecture pour la grille et la radiomessagerie – ntan