运行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
和无的列?
答案 0 :(得分:4)
将表名添加到*
。取代
SELECT * FROM product z
与
SELECT z.* FROM product z
答案 1 :(得分:1)
通常,当您这样做时,使用in
或exists
而不是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标准)而不是双引号。使用单引号仅表示字符串和日期常量有助于防止意外的语法错误。