从一个表到另外两个UNION的JOIN信息......有可能吗?

时间:2011-08-19 20:34:34

标签: mysql union inner-join

我期待的是这样的事情:

SELECT *  
FROM products as p, cat_index1 as c1, cat_index_2 as c2  
WHERE p.pid = c1.cid OR p.pid = c2.cid

不是我预期它可以工作,但EXPLAIN会产生以下错误:

Impossible WHERE noticed after reading const table...

我有一个产品列表和每个类别的表格,我想一次从多个类别中提取信息并加入产品信息。表产品中的产品可以是两类,一类或两类。输出需要是cat_index1与cat_index2的联合,我想加入来自产品的信息。

产品表非常大,其中有很多信息,但类别表只是一列,只包含所述类别成员的产品ID,当然,它们等于产品表中的id列。目前没有设置外键。

有人有什么想法吗?

4 个答案:

答案 0 :(得分:3)

SELECT *  
FROM products as p
inner join cat_index1 as c1 on (p.pid = c1.cid)

union

SELECT *  
FROM products as p
inner join cat_index2 as c2 on (p.pid = c2.cid)

答案 1 :(得分:2)

根据您所描述的结果,我认为您实际上正在寻找OUTER JOIN。试试这个:

SELECT * FROM products
    LEFT OUTER JOIN cat_index1 as c1 ON c1.cid = p.pid
    LEFT OUTER JOIN cat_index2 as c2 ON c2.cid = p.pid

此查询将在cat_index1cat_index2中返回所有产品及其相关记录。如果cat_index1cat_index2中不存在匹配记录,则结果集中仍会包含产品行。

答案 2 :(得分:1)

尝试使用WHERE IN()和union cat_index1.cid以及cat_index_2.cid:

SELECT * FROM Products AS P WHERE P.pid IN
(
SELECT cat_index1.cid
 UNION 
SELECT cat_index_2.cid
)

答案 3 :(得分:1)

尝试使用

SELECT *  
FROM products as p
where 
EXISTS(select * from cat_index1 as c1 where p.pid = c1.cid) or  EXISTS(select * cat_index_2 as c2  
WHERE p.pid = c2.cid)