带有INNER JOIN和子查询的WHERE子句

时间:2019-12-26 07:18:21

标签: mysql sql

我已经实现了所需的查询,但是我想知道这个查询是如何工作的。我的数据库中有多个表,我的要求是从名为 product 的表中提取id,并使用此id,我想从多个表中检索一些数据,然后< strong>产品ID 是其他表的foreign key。下面的查询工作正常(顺便说一句,我刚刚尝试并幸运地得到了该查询)。

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk = 
(SELECT pId FROM product WHERE pName LIKE "%booklet%")
WHERE pName LIKE "%booklet%";

desired query

但是当我尝试此查询时,

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp ON ponsfdp.pId_fk = 
(SELECT pId FROM product WHERE pName LIKE "%booklet%");

garbage query 它甚至包含空字段也包含所有数据。有人可以向我解释它是如何工作的吗?我个人认为这两个查询都应返回相同的数据,因为在第二个查询中,我使用的是子查询,并且它仅返回一个id,另一方面,第一个查询具有 WHERE 子句,它会通过名称的帮助生成相同的id。第一个查询如何返回非常特定的列,第二个查询也如何返回所有列甚至空列?我需要对两个查询进行解释。

2 个答案:

答案 0 :(得分:1)

您的第一个查询还会返回第二个查询返回的所有行。但是,当您添加最后一个过滤器时-

WHERE pName LIKE "%booklet%"

pName就像'booklet'一样,仅保留所有行中的一行。您可以将第二个查询的输出视为一个表,并且逻辑按以下方式工作-

SELECT * FROM (
    SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes 
    FROM product
    INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp 
    ON ponsfdp.pId_fk = (SELECT pId FROM product WHERE pName LIKE "%booklet%")
)A
WHERE pName LIKE "%booklet%"

希望这至少会使您对查询有一些了解。

答案 1 :(得分:0)

我在这里看不到需要任何子查询。您应该使用where条件从FROM表中选择行,然后使用联接的ON子句在FROM表的每行的联接表中找到正确的记录:

SELECT ponsfdp.*, product.pName, product.pImage, product.productSizes
FROM product
INNER JOIN priceOnSizesForDigitalPrinting AS ponsfdp
    ON ponsfdp.pId_fk = pId
WHERE pName LIKE "%booklet%";