在SQL中一起实现一对一和多对多查询

时间:2014-07-19 02:35:11

标签: php mysql sql database

我有以下表格(仅包含必要的列),我正在寻找执行查询。一些说明:

1)表1与表2和表1具有一对一的关系。 3,公共密钥是menu_id。

表4-6稍微复杂一些:

2)表1中有一对多表4,因此一个菜单可以有多个类别。

3)表4与表5有一对多,因此一个类别(多个以上)可以有很多项目。

4)表5再次与表6一对多,所以一个项目可以有很多子项。

Table 1: -- user_menu --  
         menu_id

Table 2: -- menu_details --
         menu_id

Table 3: -- menu_times --
         menu_id

Table 4: -- menu_categories --
         menu_category_id
         menu_id

Table 5: -- menu_items --
         menu_item_id
         menu_category_id

Table 6: -- menu_subitems--
         menu_subitem_id
         menu_item_id

问题:我需要一个sql查询,它将从表中获取所有相关数据(所有列,我还没有包含它们,只是主键行),用于表1中的特定menu_id。这很简单,但是我在一对多的部分中苦苦挣扎,并在同一个查询中获取数据。

我期待这样的事情。在menu_id = 2的情况下,它将获取关联的行数据(所有列)。我已缩短了适合的关键名称。

user_menu | menu_details | menu_times | menu_categories | menu_items | menu_subitems
-------------------------------------------------------------------------------------
menu_id=2  - menu_id=2  - menu_id=2 -< cat_id=1     -<    item_id=1    subitem_id=1
                                       cat_id=2     -<    item_id=2 -< subitem_id=2
                                       cat_id=3           item_id=3    subitem_id=3
                                                          item_id=4 -< subitem_id=4
                                                          item_id=5 -< subitem_id=5
                                                                       subitem_id=6
                                                                       subitem_id=7 

(我已在上面缩短了。正确的名字在第一个列表中,所以请使用这些名称。)

ID指的是我需要关联列数据的主键行。再次澄清如果我要查询menu_id = 2,我将从表2&amp;获得menu_id = 2行。 3.我还将在menu_categories表中获取类别WHERE menu_id = 2,在menu_item表中使用menu_category_id = x的item_id行,以及子项表中的menu_item表中的item_id = x的子项行。

我计划将结果复制到数组并将其传回。只需要查询位(我假设加入,但我不确定哪个是相关的。)

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,您可以使用join,使用键引用加入它们应该像这样输出:

select A.menu_id, B.menu_id, C.menu_id, D.menu_category_id, E.menu_item_id,  
       F.menu_subitem_id
from user_menu A
join menu_details B on A.menuid = B.menuid
join menu_times C on B.menuid = C.menuid
join menu_categories D on C.menuid = D.menuid
join menu_items E on D.menu_category_id = E.menu_category_id
join menu_subitems F on E.menu_item_id = F.menu_item_id
where A.menu_id = 2