gpt4 book ai didi

MySQL 子查询在没有匹配结果时忽略整行

转载 作者:行者123 更新时间:2023-11-30 23:50:58 26 4
gpt4 key购买 nike

当与该链接关联的产品 ID 可能不再存在时,我试图在 MySQL SELECT 语句中包含一个子查询以组装一个产品链接。当该产品 ID 不存在时,子查询找不到结果,最终结果中将省略整行。我希望无论如何都返回该行(使用 NULL 就可以)。

SELECT s.field_a, s.field_b, s.field_c,
(SELECT CONCAT( '/', sma.name_link, '/', smo.name_link, '.html?pid=', spr.id )
FROM sales_products AS spr, sales_sections AS see,
sales_models AS smo, sales_manufacturers AS sma
WHERE sse.id = spr.sales_section_id AND smo.id = sse.sales_model_id
AND smo.sales_manufacturer_id = sma.id
AND spr.id = s.sales_product_id
) AS product_link
FROM sales_order_items AS s, sales_products AS p
WHERE s.order_id = 100 AND p.id = s.sales_product_id
ORDER BY shipment_id, sales_order_item_id

我已经搜索了很长时间,但我就是没能把这个拼凑起来。我期待可以提供的任何类型的反馈或解决方案。

最佳答案

我在您的查询中的任何地方都没有看到 product_id 列引用,所以我假设您的意思是它的 sales_product_id 列是具有与 sales_product 表中的 id 值不匹配的值。

我认为“缺失行”的问题与 SELECT 列表中的子查询无关;我相信它与 sales_product 表的 INNER JOIN 有关。我建议您将其更改为 LEFT OUTER JOIN。

SELECT s.field_a
, s.field_b
, s.field_c
, (SELECT CONCAT('/',sma.name_link,'/',smo.name_link,'.html?pid=',spr.id)
FROM sales_products spr
JOIN sales_sections see ON sse.id = spr.sales_section_id
JOIN sales_models smo ON smo.id = sse.sales_model_id
JOIN sales_manufacturers sma ON sma.id = smo.sales_manufacturer_id
WHERE spr.id = s.sales_product_id
ORDER BY 1 LIMIT 1
) AS product_link
FROM sales_order_items s
LEFT
JOIN sales_products p ON p.id = s.sales_product_id
WHERE s.order_id = 100
ORDER BY shipment_id, sales_order_item_id

注意:SELECT 列表(别名为 product_link)中该子查询的问题在于,如果(何时?)该子查询返回多行,则该语句将抛出异常。除非您有某种保证它永远不会那样做,否则您至少可以在其上设置一个 ORDER BY 1 LIMIT 1,或者在 CONCAT 周围设置一个 MAX 聚合(以便它是确定性的。)

用表别名限定 ORDER BY 子句中的列引用也是一个非常好的主意,以防止潜在的“歧义列”异常。我看到您所有的列引用都是合格的,这真是一件好事。

您可能还注意到我重新格式化了您的原始查询,并引入了 JOIN 关键字(代替逗号),并将连接谓词从 WHERE 子句移至 ON 子句。我发现这使得语句更容易阅读,也更容易调试。它还允许您指定一个 OUTER JOIN。

关于MySQL 子查询在没有匹配结果时忽略整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11144626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com