SQL 查询连接一对多关系和多对多关系

SQL query to join one to many relation with many to many relation

我有以下结构

COFFEE         ORDER_ITEMS        ORDERS           USERS  
------         -----------        ------           -----
id             order_id           id               id
name           coffee_id          user_id          email

订单和咖啡之间存在多对多关系。以及用户和订单之间的一对多关系。我想知道用户点了哪些咖啡。

我有一个查询来检索每个用户的订单:

SELECT users.id as USERID, orders.id as ORDERID
FROM users
INNER JOIN orders on users.id = orders.user_id

举个例子:

userid  orderid
1       1
1       2
2       3   
4       4

我有一个查询来检索属于订单的咖啡:

SELECT orders.id, coffees.name
FROM orders, coffees, order_coffees
WHERE coffees.id = order_coffees.coffee_id
AND orders.id = order_coffees.order_id

例如,这给了我:

orderid coffeename
1       Coffee A
1       Coffee B
2       Coffee A
2       Coffee C

我想得到以下信息:

userid  orderid coffeename
1       1       Coffee A
1       1       Coffee B
1       2       Coffee A
2       3       Coffee C    
4       4       NULL

数据sheet
1.main订单(master_list)
3.Order详情(预订)
3.coffee 餐饮(店铺)
4.user 信息(用户)

SELECT * FROM `booking` as a 
inner join `master_list` as b on a.`mas_id`=b.`mas_id` 
inner join `shop` as c on a.`shop_id`=c.`shop_id`
inner join `user` as d on b.`user_id`=d.`user_id`

不知道对你有没有帮助试试

您应该加入从 table users 开始的所有 4 table 并使用 INNER 加入,如果您只想要订购咖啡的用户的结果至少一次,或者 LEFT 加入如果你想要所有用户的结果,即使是那些从未下过订单的用户。

ON 子句和 table 的别名使用适当的连接,使代码更具可读性:

SELECT u.id userid, 
       o.id orderid,
       c.name coffeename
FROM users u
INNER JOIN orders o ON o.user_id = u.id
INNER JOIN order_items oi ON oi.order_id = o.id
INNER JOIN coffees c ON c.id = oi.coffee_id;