2011-08-19 2 views
2
Table: A     Table: B     Table: C 
------------   ----------------   ------------- 
P_id | G_id    P_id | Name   G_id | Title 
------------   ----------------   ------------- 
1 | 1     1 | john    1 | php 
2 | 1     2 | jack    2 | sql 
3 | 2     3 | sam 

Maintenant, je suis Quering comme:Comment faire cela dans une requête SQL?

Select B.name, C.title 
from B inner join A on... 
inner join c on... 

Si nous saisissons john ici, alors il affichera comme ceci:

john php. 

Mais je veux afficher comme:

john jack php. 

Parce que G_id de john et jack est identique.
Comment puis-je faire cela?

+0

Quelle base de données utilisez-vous? – Bohemian

+0

Voulez-vous dire la sortie 'john'' jack' et' php' sur des lignes séparées ou comme littéralement 'john jack php'? –

+0

voulez-vous John et Jack dans des colonnes séparées? – Xav

Répondre

1

Pseudo code (similaire à MySQL):

SELECT B.name, C.title 
FROM B 
INNER JOIN A ON A.P_id = B.P_id 
INNER JOIN C ON A.G_id = C.G_id 
WHERE A.G_id = (
       SELECT A.G_id 
       FROM B 
       INNER JOIN A ON A.P_id = B.P_id 
       WHERE B.Name LIKE '%John%' LIMIT 1 
       ); 

EDIT:

Cela rendra vos résultats des recherches par nom, utilisez GROUP_CONCAT et GROUP BY comme suggéré par Everton Agner correctement formater les résultats.

+0

+1, ça marche bien ... il suffit d'ajouter le group_concat et il est bon pour aller – everton

1

Vous avez besoin d'une fonction d'agrégation pour travailler avec ce type de regroupement. Je ne parle pas couramment à MySQL, mais essayer quelque chose à peu près comme celui-ci, en utilisant la fonction group_concat():

select 
    group_concat(b.Name), 
    c.Title 
from 
    A a 
    join B b on b.P_id = a.P_id 
    join C c on c.G_id = a.G_id 
group by 
    c.Title 

Espérons que ça va vous montrer « john, jack »

Vérifiez la documentation sur l'agrégation fonctions ici: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

- EDIT

Juste testé, il m'a donné le résultat suivant:

+----------------------+-------+ 
| group_concat(b.Name) | Title | 
+----------------------+-------+ 
| john,jack   | php | 
| sam     | sql | 
+----------------------+-------+ 

J'espère que ce que vous voulez :)

- EDIT (la dernière)

Maintenant, je crois avoir compris ce que vous voulez, il suffit d'ajouter having group_concat(b.Name) like '%john%' et il vous donnera seulement les groupes john est inclus ... Le meilleur choix serait une fonction array contains, mais je ne l'ai pas trouvé.

+----------------------+-------+ 
| group_concat(b.Name) | Title | 
+----------------------+-------+ 
| john,jack   | php | 
+----------------------+-------+ 
+0

Vous pourriez probablement obtenir de meilleures performances avec quelques 'JOIN' supplémentaires. Obtenez seulement la ligne "john" de la table B puis "JOIN" à A pour obtenir son titre, puis "JOIN" à B pour tous ceux qui ont le même titre. Puis "JOIN" dans A & C pour la concaténation et le nom du titre. –

+0

Cela pourrait être testé, car essentiellement, plus de jointures = plus de traitement ... Mais je suis d'accord qu'en termes de design, ce serait mieux. – everton