2011-12-07 102 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');