Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL子查询在不匹配任何结果时忽略整行_Mysql_Null_Subquery - Fatal编程技术网

MySQL子查询在不匹配任何结果时忽略整行

MySQL子查询在不匹配任何结果时忽略整行,mysql,null,subquery,Mysql,Null,Subquery,我试图在MySQL SELECT语句中包含一个子查询,以便在与该链接关联的产品ID可能不再存在时组装产品链接。当该产品ID不存在时,子查询将找不到结果,并且最终结果中将忽略整行。我还是希望返回该行(可以使用NULL) 我已经找了好一阵子了,只是没能把这个拼凑起来。我期待能够提供任何类型的反馈或解决方案。您可能希望尝试在查询中使用联合,甚至使用IF-sql条件将值为空时设置为NULL 希望有帮助。我在您的查询中没有看到product\u id列引用,因此我假设您的意思是sales\u produc

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


我已经找了好一阵子了,只是没能把这个拼凑起来。我期待能够提供任何类型的反馈或解决方案。

您可能希望尝试在查询中使用联合,甚至使用IF-sql条件将值为空时设置为NULL


希望有帮助。

我在您的查询中没有看到
product\u id
列引用,因此我假设您的意思是
sales\u product\u id
列的值与sales\u product表中的
id
值不匹配

我不认为“缺少行”的问题与选择列表中的子查询有关;我相信这与sales_product表的内部联接有关。我建议您将其更改为左外连接

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)的问题是,如果(何时?)该子查询返回多行,则该语句将引发异常。除非您有某种保证,它永远不会这样做,否则您至少可以在订单上加1 LIMIT 1,或者在CONCAT周围加一个MAX aggregate(因此它是确定的)

使用表别名限定ORDERBY子句中的列引用也是一个非常好的主意,以防止潜在的“不明确列”异常。我看到您所有的列引用都是合格的,这是一件非常好的事情


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

谢谢您,斯宾塞。这完全成功了。看起来您也理解了我试图实现的目标(为了简化示例,我从查询中删除了很多内容)。同时也感谢您与我分享更多想法和最佳实践。我真的很感激。我在回复你之后点击了复选框接受答案。我想这就是你的建议?如果我还遗漏了什么,请告诉我。谢谢你的建议。我没能制定出一个可行的解决方案,但这可能是因为我相对缺乏经验。
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