2011-08-19 27 views
1

什麼我希望做的是這樣的:將一張桌子上的信息加入另外兩個人的聯盟中......可能嗎?

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等於產品表中的ID列。目前沒有設置外鍵。

任何人有任何想法?

+1

使用cat_index表之間的聯合,並把它加入與另一張桌子。 –

回答

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) 
+0

該OP還表示,「產品可以在兩個類別,一個類別或兩者都不是。」此查詢不會返回任何類別中的產品。 – Asaph

+1

或1 = 1是產品的解決方案不在類別中。 –

+0

這工作(總共3,349行,查詢花了0.0017秒) –

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中不存在匹配的記錄,則結果集中仍然包含產品行。

+0

對不起,如果我的問題是誤導性的,正如@Andrej L所說,這是SELECT * FROM產品的邏輯等價物,那麼連接就不必要了。我已經編輯了更清晰的問題,如果您認爲措辭需要更改,請發表評論。 –

+0

它不是'SELECT * FROM products'的邏輯等價物,因爲外連接給你'cat_index1'和cat_index2'數據,這大概是你要求的。我認爲你對你的問題有不同的解釋這一事實表明這確實是令人困惑的。我建議下一次,而不是建議一個解決方案(比如你如何建議'UNION'),而不是顯示一些示例數據和你的預期查詢輸出。將查詢的詳細信息留給回答者。 – Asaph

+0

正如問題最初所述,cat索引只是保留了產品id對應於表產品中的行。沒有原創內容。 4個回答中有3個是正確的,所以我不認爲我是左路出場。無論如何,我會爲您的下一個問題提出建議。謝謝回答。 –

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) 
+0

如果他這樣做了,除了來自'cat_index2'的記錄外,他無法告訴來自'cat_index1'的記錄。 – Asaph

+0

@Asaph:在兩個選擇中添加一個字段就足夠了。選擇*,'tab1'作爲source_table ... union all select *,'tab2'... –

+0

@nick rulez:這裏還有一個問題。 OP還指出:「產品可以分爲兩類,一類或兩類。」此查詢不會返回任何類別中的產品。 – Asaph

1

嘗試使用WHERE IN()和工會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 
) 
+1

啊,你是對的。他希望一次從多個類別中提取數據。 –

+0

這工作(共3,349行,查詢花了0.0024秒) –

相關問題