mysql - 正确嵌套 SQL 查询

标签 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。如果查询给出结果,我会将图像数据添加到该行。

对我来说,这感觉像是糟糕的编程实践。直觉上,我认为它可以而且应该在一个查询中完成——但我似乎无法弄清楚该查询是什么。

我希望我的措辞很清楚 - 是的,我意识到对许多人来说这将是一个非常基本的问题。有人能指出我正确的方向吗?预先非常感谢您!

最佳答案

有两种方法可以完成您的需要:第一种是您已经完成的。如果您认为这不够,请考虑使用联接:

  • 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

试试吧,也许对你有帮助。

关于mysql - 正确嵌套 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24638473/

相关文章:

PHP 查询到 HTML 单选按钮

python - SQL 到 SQLAlchemy 的翻译

vb.net - 如何在LINQ查询期间正确实现多线程进度条?

使用 Google Fonts 的 link/@import/js 方法的性能考虑

java - 奇怪的表现行为

java - 在 JSP 页面上访问 JSTL 中的嵌套对象

php - 使用 MySQL 连接两个表后无法获取两天名称

mySQL - 将 id 传递给嵌套查询

asp.net - 如何访问嵌套母版页内的控件?为什么它的行为与内容页面不同?

mysql - C API : Using Variables In mysql query