2010-02-02 3 views
0

Heureusement, je n'ai pas eu à travailler avec des requêtes SQL particulièrement complexes auparavant. Voici mon objectif.Requête MySQL impliquant une jointure croisée, unicité, etc.

J'ai la table hams, que je voudrais joindre avec la table eggs - c'est-à-dire, obtenir toutes les combinaisons de jambon-oeuf ... dans une certaine mesure. Le tableau eggs a également un attribut how_cooked, défini comme ENUM('over-easy','scrambled','poached'). Je voudrais un ensemble de résultats énumérant toutes les combinaisons possibles de jambon et de méthode de cuisson des œufs, ainsi qu'un échantillon d'œuf cuit de cette façon. (je ne me soucie pas que l'œuf en particulier.)

Donc, si 3 jambons avec id de 1, 2 et 3, et 3 oeufs de chaque méthode de cuisson, mon resultset devrait ressembler à ceci:

+---------+-----------------+---------+ 
| hams.id | eggs.how_cooked | eggs.id | 
+---------+-----------------+---------+ 
| 1  | over-easy  | 1  | 
| 1  | scrambled  | 4  | 
| 1  | poached   | 7  | 
| 2  | over-easy  | 1  | 
| 2  | scrambled  | 4  | 
| 2  | poached   | 7  | 
| 3  | over-easy  | 1  | 
| 3  | scrambled  | 4  | 
| 3  | poached   | 7  | 
+---------+-----------------+---------+ 

Je suis sûr que je pourrais bidouiller une solution avec des tas de sous-requêtes ici et là, mais est-ce qu'il y a une manière élégante de faire ceci est MySQL?

Répondre

2

Grâce à un peu de penser vraiment dur et recherche sur Google, je peux avoir trouvé une bonne solution:

SELECT * FROM hams, eggs GROUP BY hams.id, eggs.how_cooked 

Il semble fonctionner. est-ce vraiment si facile?

+0

Il fonctionne, oui, mais seulement parce que vous 'ne se soucient pas que l'œuf dans particular'. Le comportement SQL pour la sélection de colonnes non dans un GROUP BY n'est pas bien défini. Cependant, d'après mon expérience, il renvoie toujours une valeur valide. En outre, cela ne fonctionnera que tant que 'eggs' contient au moins une occurrence de chaque valeur dans l'énumération (bien sûr, il semble que ce soit une hypothèse assez sûre). – cmptrgeekken

+0

Bon - Je suis heureux de savoir qu'il y a, en fait, des pièges bien définis, car s'il n'y en avait pas de plus évidents, je suis sûr que d'obscurs apparaîtraient. Merci! – Matchu

+0

et mysql est afaik la seule base de données qui vous permettra de le faire de cette façon – ysth

1
SELECT hams.id, eggs.how_cooked, eggs.id 
FROM hams 
    CROSS JOIN eggs 

Cela fait l'affaire. CROSS JOIN est synonyme de , mais a une priorité plus élevée dans MySQL.

MySQL 5.0 Reference - JOIN syntax

Questions connexes