2011-09-27 7 views
1

J'ai deux tables comme les suivantesMySQL - Comment joindre deux tables sans doublons?

hotels 
------ 
hotelID 
hotelName 

Deuxième table

operators 
--------- 
opID 
opName 
opServices 
opHotelID 

une brève explication: Dans le premier tableau que j'ai beaucoup d'hôtels qui ont un identifiant d'incrément qui est unique. La deuxième table contient tous les opérateurs offrant cet hôtel avec des services supplémentaires. L'opID est ici aussi unique mais l'opHotelID existe plusieurs fois, car il peut y avoir plusieurs opérateurs offrant l'hôtel.

Maintenant, ce que je veux est la suivante:

Je veux obtenir le hotelName et une colonne supplémentaire (appelées Opérateurs) qui répertorie tous les opérateurs qui offrent l'hôtel.

Ainsi, le résultat devrait être comme ça ...

123 - Hotel ABC - OP1,Op2,OP3 

au lieu de cela ...

123 - Hotel ABC - OP1 
123 - HOtel ABC - OP2 
123 - Hotel ABC - OP3 

Est-il possible de le faire dans une requête SQL ou comment voulez-vous résoudre ce problème? Je travaille actuellement sur une fonction de recherche et actuellement j'ai une simple requête SELECT avec une jointure à gauche mais cela retourne beaucoup plus de lignes. Maintenant, la recherche ne devrait afficher que des identifiants d'hôtel uniques et combiner les différents opérateurs dans une seule colonne.

Merci pour vous aider et avoir une belle journée ...

Bye WorldSignia

Répondre

2

Essayez celui-ci:

SELECT hotels.hotelID, 
hotels.hotelName, 
GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList 
FROM hotels 
INNER JOIN operators 
ON operators.opHotelID = hotels.hotelID 
GROUP BY(hotels.hotelID) 

Si vous voulez avoir le nombre d'opérateurs, vous devez utiliser COUNT sur l'ID de l'opérateur comme cela:

SELECT hotels.hotelID, 
hotels.hotelName, 
GROUP_CONCAT(operators.opName SEPARATOR ', ') AS opList, 
COUNT(operators.opID) AS nbOperatos 
FROM hotels 
LEFT JOIN operators 
ON operators.opHotelID = hotels.hotelID 
GROUP BY(hotels.hotelID) 
+0

Merci. Cela fonctionne maintenant :) –

+0

Pouvez-vous peut-être aussi me dire comment je peux compter les rangées?Surtout quand j'ajoute une LIMITE à la requête. Comment puis-je obtenir les lignes max que cette requête produit? Un simple COUNT ne fonctionne pas. –

+0

J'ai édité ma réponse pour l'option count. Vous devez remplacer la jointure interne par une jointure à gauche afin qu'elle prenne les hôtels sans opérateur. – Arkh

0

vous devriez avoir une table de lien simple, cela va créer la relation plusieurs à plusieurs pour de nombreux opérateurs à un hôtel

operatorhotels 
--------- 
opID 
opHotelID 
+0

Pouvez-vous me donner un exemple de l'apparence de la requête quand j'ai cette table supplémentaire? Je vous remercie. –

0

si vous ne voulez pas changer votre conception de DB, vous pouvez utiliser cette requête

SELECT hotelID,hotelName,opName FROM hotels h 
INNER JOIN operators o ON h.hotelID = o.opHotelID 
GROUP BY h.hotelID,hotelName,opName 

autrement, créer une table de correspondance résultant de la many to many relation

+0

D'abord pour votre réponse, mais quand je lance cette requête, elle ne s'arrête jamais (j'ai aussi ajouté LIMIT 10). Les deux tables ont environ 100k enregistrements. La performance est-elle vraiment très mauvaise ou peut-être le problème? –

0

Vous devez déjà utiliser GROUP_CONCAT suggéré. Voici la requête:

SELECT h.hotelID, h.hotelName, GROUP_CONCAT(o.opName) 
FROM hotels h 
INNER JOIN operators o ON h.hotelID = o.opHotelID 
GROUP BY h.hotelID 
+0

Merci, quelle pourrait être la raison pour laquelle cette requête ne se termine jamais? (J'ai testé cela dans le client mysql sur le serveur db) –

+0

Avait d'autres problèmes avec la base de données, nécessaire pour redémarrer mysql. Maintenant, le GROUP_CONCAT fonctionne bien. –