优化 SQL 查询以使用具有外键的多个表的数组合并数据 [duplicate]

Optimizing SQL Query to Consolidate Data with Arrays for Multiple Tables with Foreign Keys [duplicate]

提问人:Raikoug 提问时间:7/24/2023 更新时间:7/24/2023 访问量:18

问:

我有多个带有外键的表,在使用联接合并当前 SQL 选择中的多个值时,我面临着挑战。当一个外国 ID 多次出现时,就会出现这个问题,导致查询返回具有相同数据的冗余行(一列除外),这是我为我兄弟开发的餐厅应用程序菜单。

enter image description here

下面是我当前使用的 SQL 代码,我已将其转换为视图:

select D.dish_id, TD.translation as dish_name, D.dish_price, TC.translation as cat_name, TI.translation as ing_name
from Dish D
join Dish_Category DC on D.dish_id = DC.dish_id
join Category C on DC.category_id = C.category_id
join Translations_Categories TC on C.category_id = TC.category_id and TC.language = "en"
join Translations_Dish TD on D.dish_id = TD.dish_id and TD.language = "en"
join Dish_Ingredient DI on D.dish_id = DI.dish_id
join Ingredient I on DI.ingredient_id = I.ingredient_id
join Translations_Ingredient TI on I.ingredient_id = TI.ingredient_id and TI.language = "en"
ORDER by D.dish_id

目前,查询返回所有具有冗余信息的元素,同一dish_id之间唯一的信息更改是ing_name列:

dish_id dish_name       dish_price  cat_name    ing_name
    1   Tomato Sauce    5.00        Pizzas      Tomato
    2   White Sauce     5.00        Pizzas      Mozzarella
    3   Margherita      5.00        Pizzas      Tomato
    3   Margherita      5.00        Pizzas      Mozzarella
    4   Napoli          6.00        Pizzas      Tomato
    4   Napoli          6.00        Pizzas      Mozzarella
    4   Napoli          6.00        Pizzas      Capers
    4   Napoli          6.00        Pizzas      Anchovies

在这里,我有我需要的所有信息(不是真的,从图中可以看出,每种成分都有我需要的 2 个值,但每次有 1 个)。

但是,我想找到一种方法来合并数据,以便每个 ID 只有一行,并且成分名称被打包到相应列中的数组中。理想的结果如下所示:

dish_id dish_name       dish_price  cat_name    ing_name
    1   Tomato Sauce    5.00        Pizzas      Tomato
    2   White Sauce     5.00        Pizzas      Mozzarella
    3   Margherita      5.00        Pizzas      [Tomato, Mozzarella]
    4   Napoli          6.00        Pizzas      [Tomato, Mozzarella, Capers, Anchovies]

展望未来,我需要让事情复杂化一点,每种成分都有 2 个不可告人的价值!也许是像 json 数据这样的东西?

dish_id dish_name       dish_price  cat_name    ing_name
    1   Tomato Sauce    5.00        Pizzas      Tomato
    2   White Sauce     5.00        Pizzas      Mozzarella
    3   Margherita      5.00        Pizzas      {"Tomato": {"allergenes": false, "frozen" : false}, "Mozzarella": {"allergenes": true, "frozen" : false} }
    4   Napoli          6.00        Pizzas      {"Tomato": {"allergenes": false, "frozen": false}, "Mozzarella": {"allergenes": true, "frozen": false}, "Capers": {"allergenes": true, "frozen": false}, "Anchovies": {"allergenes": true, "frozen": false}}

我将不胜感激任何关于优化 SQL 查询和有效打包数据以供前端显示的指导或建议。此外,如果有更好的方法在前端显示数据,而不是使用视图的单个查询,请告诉我。谢谢!

MySQL 数组 联接

评论

0赞 Shadow 7/24/2023
您可以在 mysql 端执行此操作(请参阅重复的问题),但是,如果您在应用程序中执行 jsonify,将 mysql 保留为关系数据库,而不是 nosql 数据库,可能会更好!
0赞 Raikoug 7/24/2023
你的意思是我应该在后端做更多的查询,然后与代码相关联,然后将其提供给前端?SQL在关联数据方面不是更胜一筹吗?
0赞 Shadow 7/24/2023
Sql 擅长组合来自多个表的数据,但在将数据格式化为分层结构方面效率较低。

答: 暂无答案