一对多请求:根据条件仅检索多个表中的一个值

问题描述 投票:0回答:1

我有两个由 Produit_ID 字段连接的表:

Table Products
Produit_ID | Name
1          | Some product
2          | Some other product

Table Prices
Price_ID   | Produit_ID | Code_Prix | Validity_From | Validity_To
1          | 1          | 222       | 2024-01-01    | 2100-01-01
2          | 1          | 658       | 2024-01-01    | 2100-01-01
3          | 2          | 222       | 2024-01-01    | 2100-01-01

难题如下:我需要从两个表中获取所有字段,但对于价格表,我只需要 Code_Prix 中包含 658 的行(如果存在),否则恢复为 222 Code Prix。

换句话说,对这两种产品的请求应返回第一行的 Product_ID = 1 和 Price_ID = 2 的数据,以及第二行的 Product_ID = 2 和 Price_ID = 3 的数据。

性能在这里至关重要。这是要求我在单个请求中获取这些数据的条件,因为最终查询将在包含 15k/120k 行的表中获取大约 500 个产品/价格。

这个好像想不通。

任何提示表示赞赏!

mariadb one-to-many
1个回答
0
投票

使用两个连接,每个连接一个

Code_Prix
。使用
LEFT JOIN
代表
Code_Prix = 658
,因为它可能不存在,那么您可以使用
COALESCE()
来选择它,回到
Code_Prix = 222
所在的行。

SELECT products.*,
    COALESCE(p1.Price_ID, p2.Price_ID) AS Price_ID,
    COALESCE(p1.Code_Prix, p2.Code_Prix) AS Code_Prix,
    COALESCE(p1.Validity_From, p2.Valdity_From) AS Validity_From,
    COALESCE(p1.Validity_To, p2.Valdity_To) AS Validity_To
FROM products
LEFT JOIN prices AS p1 ON p1.Produit_ID = products.Produit_ID AND p1.Code_Prix = 658
INNER JOIN prices AS p2 ON p2.Produit_ID = products.Produit_ID AND p2.Code_Prix = 222
© www.soinside.com 2019 - 2024. All rights reserved.