You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL交叉引用表与外键结构解析及关联查询咨询

查询Apple Pie所有配料的正确SQL语句

没问题,我来帮你理清楚这个多对多关联场景下的查询逻辑~首先你这里的table_food_ingredient就是典型的交叉引用表(Xref Table),用来解决食物和配料之间的多对多关系——一个食物可以对应多个配料,一个配料也能被多个食物使用。

最常用的JOIN方式查询

这种方式通过关联三个表直接获取结果,可读性和性能都不错:

SELECT i.name AS ingredient_name
FROM table_food f
INNER JOIN table_food_ingredient fi 
    ON f.id = fi.food_id
INNER JOIN table_ingredient i 
    ON fi.ingredient_id = i.id
WHERE f.name = 'apple_pie';

逻辑拆解:

  1. 先从table_food中筛选出名称为apple_pie的记录,拿到它的id(也就是1);
  2. 通过food_id关联到table_food_ingredient,找出所有和这个食物ID匹配的配料ID(1、3、4);
  3. 最后通过ingredient_id关联到table_ingredient,把配料ID转换成对应的配料名称(apple、milk、flour)。

子查询方式(适合理解逻辑)

如果你更习惯用子查询,也可以这样写:

SELECT name AS ingredient_name
FROM table_ingredient
WHERE id IN (
    SELECT ingredient_id
    FROM table_food_ingredient
    WHERE food_id = (
        SELECT id
        FROM table_food
        WHERE name = 'apple_pie'
    )
);

这种方式是层层嵌套:先找到apple_pie的ID,再找对应的配料ID,最后查询配料名称。不过数据量大的时候,JOIN的性能通常会更好一些。

额外补充:外键的作用

为了保证数据的完整性,建议给table_food_ingredient的两个字段设置外键:

  • food_id关联table_food.id
  • ingredient_id关联table_ingredient.id

这样可以避免插入不存在的食物ID或配料ID,也能在删除食物/配料时,通过设置级联删除或限制删除来防止出现无效的交叉记录。

内容的提问来源于stack exchange,提问作者Unknown Danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:35:47