2014-10-05 26 views
0

运行INNER JOIN类型的查询时,我得到重复的列名称,这可能会导致问题。这已经在这里被广泛地讨论过了,我能够找到解决这个问题的方法,除此之外它是相当合理的,只有我需要的列是SELECT使用INNER JOIN而不返回连接表中的任何列

但是,我想知道我怎么可以运行这样的查询,而实际上没有从连接的表中返回任何列。

这是我的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) 

问题

我怎么会为了从这些柱product没有crosslink__productXmanufacturer只返回列修改此MySQL查询?

回答

4

将表名添加到*。更换

SELECT * FROM product z 

SELECT z.* FROM product z 
+0

简单的这让我感到羞耻!谢谢!! – SquareCat 2014-10-05 15:01:44

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标准)而不是双引号引号。对于字符串和日期常量,仅使用单引号有助于防止无意的语法错误。

+0

这是宝贵的意见,帮助我更全面地理解这个问题。谢谢! – SquareCat 2014-10-05 15:15:05