使用INNER JOIN而不返回连接表中的任何列

时间:2014-10-05 14:56:35

标签: mysql inner-join

运行INNER JOIN类型的查询,我得到重复的列名,这可能会造成问题。这已被广泛涵盖,我能够找到这个问题的解决方案,除了它是相当合理的,SELECT只需要我需要的列。

但是,我想知道如何在不实际返回连接表中的任何列的情况下运行此类查询。

这是我的MySQL查询

SELECT * FROM product z 
    INNER JOIN crosslink__productXmanufacturer a
    ON z.id = a.productId
WHERE 
    (z.title LIKE "%search_term%" OR z.search_keywords LIKE "%search_term%")
AND
    z.availability = 1 
AND 
    a.manufacturerId IN (22,23,24)

问题

我如何修改此MySQL查询,以便仅返回product列中crosslink__productXmanufacturer的列?

2 个答案:

答案 0 :(得分:4)

将表名添加到*。取代

SELECT * FROM product z 

SELECT z.* FROM product z 

答案 1 :(得分:1)

通常,当您这样做时,使用inexists而不是join可能会更清楚。 join用于过滤,因此将条件放在where子句中是有道理的:

SELECT p.*
FROM product p
WHERE (p.title LIKE '%search_term%' OR p.search_keywords LIKE '%search_term%') AND
      p.availability = 1 AND 
      exists (SELECT 1
              FROM pXm
              WHERE pXm.productId = p.id AND pxm.manufacturerId IN (22, 23, 24)
             );

使用正确的索引,这应该至少与join版本一样快(索引为crosslink__productXmanufacturer(productId, manufacturerId)。此外,您不必担心返回重复记录,如果有是crosslink__productXmanufacturer中的多个匹配。

您可能会注意到我对查询做出的另外两项小改动。首先,表别名是表名的缩写,使逻辑更容易理解。其次,字符串常量使用单引号(ANSI标准)而不是双引号。使用单引号表示字符串和日期常量有助于防止意外的语法错误。