2010-01-30 4 views
0

J'ai deux tables stockant des données membresMySql Requête: commande de deux champs dans deux tables

membres: id, field1, field2 et Field3 ...

members_extra: MemberID, someExtraField1 et someExtraField2

members_extra.memberId est une référence clé étrangère members.id

« members_extra » ou non avoir des lignes connexes pour les lignes de « membres »

disons: j'ai 1000 membres dans 'membres', et j'ai 50 lignes dans 'members_extra' contenant des informations supplémentaires

maintenant je veux rechercher 'membres' et classer les résultats selon 'member.field2' .. mais je veux que les membres qui ont des informations supplémentaires (dans members_extra) soient listés avant ceux qui n'ont pas d'informations supplémentaires

maintenant j'utilise member.field3 comme ENUM ('vrai', 'faux') qui indique si cela Le membre a des informations supplémentaires ou non et commande comme ceci: ORDER BY field3 ASC, field2 ASC ... cela fonctionne bien, mais je n'aime pas l'approche, puisque je dois mettre à jour members.field3 chaque fois que j'insère ou supprime quelque chose members_extra

comment t o le faire sans utiliser members.field3?

merci

Répondre

0
order by member_extra.something desc 

premier, qui, je crois la liste NULLs après les non-NULLs, ou

order by case when member_extra.something IS NOT NULL 1 else 2 end 
0
SELECT members.id, 
     members.field1, 
     members_extra.someExtraField1, 
     Ordering = CASE members_extra.memberId WHEN NULL THEN 'Z' ELSE 'A' END 
    FROM members 
     LEFT JOIN 
     members_extra ON members.Id = members_extra.memberId 
    ORDER BY Ordering 
1

Vous pouvez inclure une clause ORDER BY si members_extra.memberId est présent ou non:

SELECT * 
FROM members 
LEFT JOIN members_extra 
ON members.id = members_extra.memberId 
ORDER BY members_extra.memberId IS NULL, members.field2 

Vous n'avez plus besoin de members.field3 et vous pouvez le supprimer de votre schéma. Cela rendra votre base de données plus proche de la forme normalisée.

0

MERCI BEAUCOUP

Cela fonctionne !!!

SELECT * FROM members LEFT JOIN members_extra ON members.id = members_extra.memberId ORDER BY members_extra.memberId IS NULL, members.field2`enter code here` 

Cela donne une erreur:

SELECT members.id, members.field1, members_extra.someExtraField1, 

Ordering = CASE members_extra.memberId WHEN NULL THEN 'Z' ELSE 'A' END FROM members LEFT JOIN members_extra ON members.Id = members_extra.memberId ORDER BY Ordering

Il devrait ressembler à ceci:

Blockquote

SELECT members.id, members.field1, members_extra.someExtraField1, 

CASE members_extra.memberId WHEN NULL THEN 1 ELSE 0 END AS Ordering FROM members LEFT JOIN members_extra ON members.Id = members_extra.memberId ORDER BY Ordering

Blockquote

Une chose étrange que ... quand j'utilise la dernière requête que je reçois toujours la commande = 1 .. même s'il n'y a pas de ligne correspondante dans members_extra