2017-03-02 38 views
0

好吧,我得到了这个问题。我有以下表格:SQL如何在不同的连接条件下使用相同的字段?

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  | 

我很好与此查询:

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 

结果:

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   | 

,但现在我需要添加店铺列如下:

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 | 

这就是我迄今为止得到的结果,但它如何在shop_name场返回null:

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 

我觉得proble是这样的: “GROUP_CONCAT(CONCAT(CASE WHEN m.id = s.member_id THEN m.full_name END)分隔符 '')shop_name” shop_name和供应商来自member.role_id

任何人都可以帮我吗?我将非常感谢:)

+0

什么是'A'后'0'什么意思?这对我来说看起来像一个语法错误。 – Barmar

+0

'm.id = s.member_id'将始终为真,因为它是连接中的“ON”条件。 – Barmar

+0

@Barmar对不起我的坏,我认为我的手指滑了,当我写这个问题,我已经修复它 – fandiahm

回答

1

你必须加入member两次。一次获取基于fruits.vendor_id的供应商名称,并单独获取基于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

非常感谢,它的工作:) – fandiahm

相关问题