正确嵌套SQL查询

时间:2014-07-08 17:50:35

标签: mysql performance nested

所以我现在已经编写了几个月的代码,我想我已经开始使用MySQL了。我现在可以很好地CRUD了。然而,有一个非常基本的概念让我不知所措,而我似乎无法找到最佳解决方案。这个概念基本上围绕着当必须从不同的表中获取数据时的最佳实践 - 当并非所有数据都在其他相关表上连接时。

例如,让我们说我的任务是从两个单独的表中获取所有产品和图像,一个名为产品,另一个名为图像。虽然所有图片都有相关产品,但并非所有产品都有图片

我开始写我的查询:

SELECT product_name, productId FROM products

首先获取相关的产品信息。这是我难倒的地方。获得实际拥有图像的产品的图像的最佳方法是什么?我不能像这样加入图像表:

SELECT product_name, image FROM products, images 
       WHERE images.image_product_Id = products.productId

因为这不会撤回任何在图像表上没有连接的产品。

现在,我的解决方案是运行第一个查询,撤回结果,然后当我逐行遍历产品数据时,我运行一个图像子查询,其中显示:

SELECT image FROM images WHERE images.image_product_Id = '$productId'

其中变量$ productId是该行的特定productId。如果查询给我结果,我将图像数据添加到行。

这对我来说感觉就像糟糕的编程习惯。直观地说,我认为它可以而且应该在一个查询中完成 - 但我似乎无法弄清楚那个查询会是什么。

我希望我明白我的措辞是什么 - 是的,我意识到对很多人来说这将是一个非常基本的问题。有人能指出我正确的方向吗?非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

有两种方法可以满足您的需求:首先是您已经完成的工作。如果您认为这是不合适的,请考虑使用连接:

  • table1 INNER JOIN table2 ON ...将返回彼此匹配的两个表的行(您使用where面临的问题)
  • table1 LEFT JOIN table2 ON ...将返回所有来自table1的行以及来自table2的匹配行,如果第二个表中没有匹配的行,列将具有NULL
  • table2 RIGHT JOIN table2 ON ...嗯......它与上面相同,但是向后

所以,在你的例子中,我会写一个这样的查询:

select product_name, image
from products left join images on products.productId = images.image_product_id;

此查询将返回所有产品和所有匹配的图片,但如果没有与给定产品相关联的图片,则该产品的列值将为NULL

尝试一下,它可能对你有帮助。