2017-03-02 2 views
0

Ok, j'ai ce problème. J'ai tableaux suivants:SQL comment utiliser le même champ avec différentes conditions de jointure?

member 
id | username  | role_id | full_name  | 
1 | [email protected] | 1  | administrator | 
2 | [email protected] | 2  | Sunkist   | 
3 | [email protected] | 2  | BlueJam   | 
4 | [email protected] | 3  | Fresh Shop  | 
5 | [email protected] | 3  | Other Shop  | 

role 
id | role   | 
1 | superadmin | 
2 | vendor  | 
3 | shop   | 

fruits 
id | fruit_name | barcode | vendor_id | 
1 | banana  | 12345 | 2  | 
2 | melon   | 23456 | 2  | 
3 | apel   | 34567 | 3  | 
4 | orange  | 45678 | 3  | 
5 | papaya  | 56789 | 2  | 

shop_base 
id | fruit_id | member_id | 
1 | 1  | 4  | 
2 | 1  | 5  | 
3 | 2  | 4  | 
4 | 2  | 5  | 
5 | 3  | 5  | 
6 | 4  | 5  | 
7 | 5  | 5  | 

Je suis très bien avec cette requête:

SELECT f.barcode, f.fruit_name, m.full_name AS vendor, f.id AS fruit_id 
FROM fruits AS f 
LEFT JOIN member AS m ON f.vendor_id = m.id 
WHERE f.vendor_id > 0 
GROUP BY f.barcode 
ORDER BY f.barcode DESC 

Résultat:

barcode | fruit_name | vendor | fruit_id | 
56789 | papaya  | Sunkist | 5   | 
45678 | orange  | BlueJam | 4   | 
34567 | apel   | BlueJam | 3   | 
23456 | melon   | Sunkist | 2   | 
12345 | banana  | Sunkist | 1   | 

mais maintenant je dois ajouter la colonne de magasin comme ceci:

barcode | fruit_name | vendor | fruit_id | shop_name    | 
56789 | papaya  | Sunkist | 5   | Other Shop    | 
45678 | orange  | BlueJam | 4   | Other Shop    | 
34567 | apel   | BlueJam | 3   | Other Shop    | 
23456 | melon   | Sunkist | 2   | Fresh Shop, Other Shop | 
12345 | banana  | Sunkist | 1   | Fresh Shop, Other Shop | 

c'est comme ça que je suis arrivé des moyens de retour nul sur le terrain de shop_name:

SELECT f.barcode, f.fruit_name, m.full_name AS vendor, f.id AS fruit_id, GROUP_CONCAT(CONCAT(CASE WHEN m.id = s.member_id THEN m.full_name END) SEPARATOR ', ') shop_name 
FROM fruits AS f 
LEFT JOIN member AS m ON f.vendor_id = m.id 
LEFT JOIN shop_base AS s ON m.id = s.member_id 
WHERE f.vendor_id > 0 
GROUP BY f.barcode 
ORDER BY f.barcode DESC 

Je pense que le problèm est sur ce point: "GROUP_CONCAT (CONCAT (CAS QUAND m.id = s.member_id ALORS m.full_name FIN) SÉPARATEUR '') shop_name" shop_name et le vendeur vient du même champ sur member.role_id

quelqu'un s'il vous plaît pourrait m'aider? Je serai très reconnaissant :)

+0

Qu'est-ce 'A' après' 0' censé signifier? Cela ressemble à une erreur de syntaxe pour moi. – Barmar

+0

'm.id = s.member_id' sera toujours vrai, car c'est la condition' ON' dans la jointure. – Barmar

+0

@Barmar désolé mon mauvais, je pense que mes doigts glisser quand j'écris la question que je fixe déjà – fandiahm

Répondre

1

Vous devez rejoindre avec member deux fois. Une fois pour obtenir le nom du fournisseur basé sur fruits.vendor_id, et séparément pour obtenir le nom du spectacle basé sur shop_base.

SELECT f.barcode, f.fruit_name, m.full_name AS vendor, f.id AS fruit_id, GROUP_CONCAT(m1.full_name SEPARATOR ', ') shop_name 
FROM fruits AS f 
LEFT JOIN member AS m ON f.vendor_id = m.id 
LEFT JOIN shop_base AS s ON f.id = s.fruit_id 
LEFT JOIN member AS m1 ON s.member_id = m1.id 
WHERE f.vendor_id > 0 
GROUP BY f.barcode 
ORDER BY f.barcode DESC 

DEMO

+0

Merci beaucoup, ça fonctionne :) – fandiahm