2011-02-01 92 views
0

嗨,我想知道是否有可能做下面的事情。很明顯,我試圖在phpMyAdmin中運行這個,但有一個錯誤。也許有另一種方法來寫這個查詢。MySQL加入列a IN(列b)

SELECT * FROM eat_eat_restaurants AS r 
INNER JOIN eat_eat_cuisines AS c ON c.cuisine_id IN (r.cuisine_ids) 

除此之外,還可以在一行中選擇餐廳名稱和美食嗎?例如

r_name c_names 
Marco's Italian, Modern European 

我的2個表看起來像這樣:

TABLE EAT_EAT_RESTAURANTS 
id r_name cuisine_ids 
1 Marco's 1,2 
2 Beldaro 3,4 
3 Benny's 1,3 


TABLE EAT_EAT_CUISINES 
id c_name 
1 Italian 
2 Modern European 
3 Greek 
4 Belgian 
5 ... 
+3

你出手自己的腳通過存儲`cuisine_ids`爲逗號分隔的列表。你應該使用一箇中間表來處理這種m-to-n關係。對於你的問題的第二部分:GROUP_CONCAT() – Mchl 2011-02-01 15:42:53

+0

謝謝,不是在腳下拍攝,仍然在設計過程中 - 很高興有你們的幫助,在stackoverflow! – Martin 2011-02-01 16:12:24

回答

2

您當前的模式未規範化,效率非常低。嘗試3個表:restaurantscuisinesrestaurant_cuisines,做這樣的查詢:

SELECT r.r_name, GROUP_CONCAT(c.c_name) 
FROM restaurants r JOIN restaurant_cuisines rc ON (r.id=rc.r_id) 
JOIN cuisines c ON (rc.c_id=c.id) 
GROUP BY r.r_name; 
1

不行,語法並不喜歡這項工作。

您需要做的是在餐廳和美食之間創建一個交叉表,因爲美食可以屬於多個餐廳,餐廳提供多種美食。之後,您可以將三張桌子連接在一起,以獲取餐廳的名稱以及所提供的所有美食的名稱。

交叉表將具有這樣的字段:

id restaurant_id cuisine_id 
1 1    1 
2 1    2 
3 2    1 
4 2    3 
5 4    1 
1

需要第三個表:

 
TABLE EAT_EAT_CUISINES_LOOKUP 
r_id cuisine_ids 1 
1  1 
1  2 
// for Marco 

下JOIN到它,如果)導致1線需要使用GROUP_CONCAT(

0

作爲其他的解決辦法,我建議使用一個連接表,讓您的查詢簡單。 讓我們將其命名爲:restaurant_cuisine 一個例子:

Id restaurant_id cuisine_id 
1  1   1 
1  1   2 
相關問題