2011-12-07 51 views
1

我無法弄清楚如何獲得我需要的結果。有人可以幫忙嗎?SQL JOIN - 不明白

這些都是MySQL表我:

restaurant   menu     menu_has_dishes    dishes 
----------   ----     ---------------    ------ 
id (k)  <-> restaurantid   id (k)      title 
name     id (k)  <->  menuid      price 
        date     dishid    <->  id (k) 

我需要得到各自的菜餚列表中的所有菜單的某一天,屬於一間餐廳。任何人都可以向我展示正確的SQL查詢,也許可以解釋它...?

謝謝... :)

+3

這看起來很像功課。如果是,請添加作業標籤。 – NealB

+0

恐怕不是...;( – Hein

回答

2
SELECT d.title, d.price 
FROM dishes d 
JOIN menu_has_dishes md ON d.id = md.dishid 
JOIN menu m ON md.menu_id = m.id 
WHERE m.restaurantid = [[your restaurant id goes here]] 

這會給你的輸出是這樣的:

----------- 
|Fish|1.00| 
|Ham |2.00| 
|... |... | 
----------- 

讓我們打破這個查詢的部分:

--Tell the database what fields you care about 
SELECT d.title, d.price 

--Tell it what table to start with, and give it a nickname "d" 
FROM dishes d 

--join to menu_has_dishes so we know what menus contain each dish 
JOIN menu_has_dishes md ON d.id = md.dishid 

--join to menu so we know what restaurant has each menu 
JOIN menu m ON md.menu_id = m.id 

--finally, tell it what restaurant to look at 
WHERE m.restaurantid = [[your restaurant id goes here]] 
+0

+1解釋查詢的每一行是怎麼回事 –

+0

@PaigeCook很高興知道我的努力,非常感謝:) – ean5533

+0

感謝您的解釋,但我需要菜單中的數據和菜... – Hein

1

這將返回表格中的所有字段,用於日期上的餐廳'5':

SELECT * 
FROM restaurant r 
INNER JOIN menu m ON (r.id=m.restaurantid) 
INNER JOIN menu_has_dishes md ON (m.menuid=d.menuid) 
INNER JOIN dishes d ON (md.dishid=d.id) 
WHERE r.id = 5 
AND m.date = '2011-12-07' 

你可能只是想它來獲取相關信息:

SELECT r.id, r.name, m.date, d.title, d.price 
0
SELECT res.id, res.name,m.id,m.date FROM restaurant res 
JOIN menu m ON m.restaurantid = res.id 
JOIN menu_has_dishes mhd ON mhd.menuid = m.id 
JOIN dishes d ON d.id = mhd.dishid 
WHERE res.id = ? 
0
SELECT r.name, m.date, d.title, d.price 
FROM 
    restaurant r 
    INNER JOIN menu m 
     ON r.id=m.restaurantid 
    INNER JOIN menu_has_dishes md 
     ON m.id=md.menuid 
    INNER JOIN dishes d 
     ON md.dishid=d.id 
WHERE 
    r.id = 123  -- OR r.name = 'abc' 
    AND 
    m.date = CONVERT(date,'2011/12/06');