Php 使用外键和多对一连接三个表

Php 使用外键和多对一连接三个表,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,我有三张桌子 常见的插件 阿顿斯酒店 菜单 常用插件的id是hotel插件中属性common插件id的外键,hotel插件的id是表菜单中属性hotel插件id的外键 我想通过包含属性hotel\u addons\u id的表菜单获得common\u addons的名称。属性hotel\u addons\u id包含由commasthrough内爆函数分离的多个hotel\u addons id。这就是您现在拥有的 menu -------------- id

我有三张桌子

常见的插件

阿顿斯酒店

菜单

常用插件的id是hotel插件中属性common插件id的外键,hotel插件的id是表菜单中属性hotel插件id的外键


我想通过包含属性hotel\u addons\u id的表菜单获得common\u addons的名称。属性hotel\u addons\u id包含由commasthrough内爆函数分离的多个hotel\u addons id。

这就是您现在拥有的

menu
--------------
id                           1
hotel_addons_id              1,2,3,4
这与其说是一个答案,还不如说是解释了一个多人和一个多人是如何造就一个多人的

hotel_addons
--------------
id                           1        //one to many - one addon has many records in the bridge table

menu_hotel_addons  (bridge table)  = many to many
-------------------------
menu_id                        1     //many to one  - many bridge records point to the menu
hotel_addons_id                1     //many to one  - many bridge records point to the addons table

 menu
 --------------
id                           1     //one to many  - one menu has many records in the bridge table
在桥接表中,主键是两个外键的复合键,每个外键都是自动递增的代理键

换句话说,一个菜单可以有许多插件,插件可以属于许多菜单项。你现在拥有它的方式,是一个可怜的黑客,永远不会给你你所需要的

您不能在逗号分隔的列表上加入,至少不容易。这样做容易得多:

     SELECT 
        m.*,
        a.*
     FROM
         menu AS m
     JOIN
          menu_hotel_addons AS ma
     ON 
        m.id = ma.menu_id
     JOIN
        hotel_addons  AS a
     ON
        ma.hotel_addons_id = a.id

等等。

包含多个用逗号分隔的hotel_插件ID不是一个好主意。@ArtisticPhoenix那么你认为这是一个2多字段吗?我建议使用桥接表,另一个连接菜单和hotel_插件的表,因为这似乎是一个多对多关系。你只能用一个表来表示多对一,所以在另两个表中都添加一个多对一的第三个表谢谢你,现在要做一个桥接表,对吧,这就是你通常定义多对多关系的方式,可以用CSV列表来完成,但是你需要在开始和结束处加上逗号,使用像,1,4和,13,4这样的方法,你可以在hotel_addons_id像“%”,1,%”上做,没有开头和结尾,像“%1%”会错误地匹配13和1,如果这有意义的话。但是仍然是一团糟,如果可能的话,我会尽量避免,而且性能会很糟糕。你需要在酒店的插件上使用类似的东西,比如CONCAT“%”、“、”、menu_id“、%”和其他垃圾,所以这将是一团糟。我不确定你是否能在ON条款中这样做。如果这有意义的话,最好遵循本例中的规则,我使用了上面的列表,但仅用于具体化的路径树数据,这是一个完全不同的主题。
     SELECT 
        m.*,
        a.*
     FROM
         menu AS m
     JOIN
          menu_hotel_addons AS ma
     ON 
        m.id = ma.menu_id
     JOIN
        hotel_addons  AS a
     ON
        ma.hotel_addons_id = a.id