简体   繁体   English

MySQL-#1066-非唯一表/别名:具有多个内部联接的“组件”

[英]MySQL - #1066 - Not unique table/alias: 'components' with multiple inner joins

I have this query and I am getting error #1066 - Not unique table/alias: 'components' . 我有此查询,并且出现错误#1066-不是唯一的表/别名:'components' What seems to be the issue? 似乎是什么问题?

SELECT COUNT(*) FROM `products`, `components`, `tradeNames` 
INNER JOIN `componentsMap` ON componentsMap.product_id = product.id 
INNER JOIN `components` ON componentsMap.component_id = components.id 
INNER JOIN `tradeNamesMap` ON .tradeNamesMap.product_id = products.id 
INNER JOIN `tradeNames` ON tradeNamesMap.tradeName_id = tradeNames.id 
WHERE (((((LOWER(inci) LIKE '%abies%') 
          OR (trade_name.LOWER(name) LIKE '%abies%')) 
         OR (components.LOWER(no_cas)='abies')) 
        OR (components.LOWER(no_einecs)='abies')) 
       OR (components.LOWER(name)='abies'))
AND (`published`=1) 
ORDER BY `trade_name`.`name` DESC

You don't need to list the tables before the INNER JOIN s. 您不需要在INNER JOIN之前列出表。 In fact, simply don't ever use commas in the FROM clause. 实际上,根本不要在FROM子句中使用逗号。 So: 所以:

SELECT COUNT(*)
FROM `products`
INNER JOIN `componentsMap` ON componentsMap.product_id = product.id 
INNER JOIN `components` ON componentsMap.component_id = components.id 
INNER JOIN `tradeNamesMap` ON tradeNamesMap.product_id = products.id 
INNER JOIN `tradeNames` ON tradeNamesMap.tradeName_id = tradeNames.id 
WHERE (((((LOWER(inci) LIKE '%abies%') 
          OR (trade_name.LOWER(name) LIKE '%abies%')) 
         OR (components.LOWER(no_cas)='abies')) 
        OR (components.LOWER(no_einecs)='abies')) 
       OR (components.LOWER(name)='abies'))
AND (`published`=1) 
ORDER BY `trade_name`.`name` DESC;

The above query only returns one row because of the COUNT() . 上面的查询由于COUNT()而仅返回一行。 The order by suggests that you actually want this information for each trade_name.name . order by表明您实际上需要每个trade_name.name此信息。 If so, you need a GROUP BY : 如果是这样,则需要GROUP BY

SELECT tn.name, COUNT(*)
FROM `products` p INNER JOIN
     `componentsMap cm
     ON cm.product_id = p.id INNER JOIN
     `components` c
     ON cm.component_id = c.id INNER JOIN
     `tradeNamesMap` tnm
     ON tnm.product_id = p.id INNER JOIN
     `tradeNames` tn
     ON tnm.tradeName_id = tn.id 
WHERE ((LOWER(inci) LIKE '%abies%') OR
       (tn.LOWER(name) LIKE '%abies%') OR
       (c.LOWER(no_cas)='abies') OR
       (c.LOWER(no_einecs)='abies') OR
       (c.LOWER(name)='abies')
      ) AND
      (`published` = 1) 
GROUP BY tn.name
ORDER BY tn.`name` DESC
INNER JOIN `[components]` ON componentsMap.component_id = components.id 

AND

SELECT COUNT(*) FROM `products`, [`components`], `tradeNames` 

Two components are there. 有两个components

Just guessing, and untested, but I suspect that something like this would do what you're after... 只是猜测,并且未经测试,但是我怀疑这样的事情会做您想要做的...

SELECT n.name
     , COUNT(*)
  FROM products p
  JOIN componentsMap pc
    ON pc.product_id = p.id 
  JOIN components c
    ON c.id = pc.component_id 
  JOIN tradeNamesMap pn
    ON pn.product_id = p.id 
  JOIN tradeNames n
    ON n.id = pn.tradeName_id 
 WHERE 
     ( inci LIKE '%abies%'
    OR n.name LIKE '%abies%'
    OR 'abies' IN (c.no_cas,c.no_einecs,c.name)
     )
   AND published = 1
 GROUP
    BY n.name
 ORDER 
    BY n.name DESC

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM