所以我现在已经编写了几个月的代码,我想我已经开始使用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。如果查询给我结果,我将图像数据添加到行。
这对我来说感觉就像糟糕的编程习惯。直观地说,我认为它可以而且应该在一个查询中完成 - 但我似乎无法弄清楚那个查询会是什么。
我希望我明白我的措辞是什么 - 是的,我意识到对很多人来说这将是一个非常基本的问题。有人能指出我正确的方向吗?非常感谢你提前!
答案 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
。
尝试一下,它可能对你有帮助。