2011-02-01 93 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 
相关问题