2013-09-24 106 views
0

我們有兩個表:「有條件加入」在MySQL - (不同的連接條件下)

產品和商店

一個店基本上可以有很多產品。我們正在從產品表中進行選擇,但我們將其加入到商店表中,以便我們只選擇來自當前「活躍」商店的產品。

但是,我們只希望發生這種行爲,如果它不是查看給定產品的商店所有者。

所以,基本上我想要做的是有一個查詢,我們可以提供當前登錄的user_id到查詢,並對商店表進行連接。如果提供的user_id匹配stores表中的那個,那麼它就是店主 - 我們應該允許他們查看產品[這將基本上以不同的條件加入]。如果user_id與stores表中的不同,那麼它是普通用戶,不應該被允許查看產品。

這裏是我的兩個查詢:

店主

SELECT products.* from products 
INNER JOIN stores 
ON stores.id = products.store_id 
AND stores.user_id = <supplied userid> 

普通用戶

SELECT products.* from products 
INNER JOIN stores 
ON stores.id = products.store_id 
AND stores.is_active = 1 

我基本上要推出這些成一個查詢,如果可能的話。

+0

你對這兩張表有什麼指標?使用'UNION ALL'(或者'UNION'作爲不同的記錄)可以更好地使用任何索引。您將使用更多的代碼,您可能會得到更好的查詢計劃。 – GarethD

+0

在[本例中](http://sqlfiddle.com/#!2/37233/1)中詳細說明,聯合查詢能夠在'is_active'和'user_id'上使用索引,使用OR的則不使用這些索引只是執行表掃描。在一個數據集中,這個例子的大小是無關緊要的,在一個更大的數據集中,這可能會產生顯着的差異。 – GarethD

+0

所以你想要如果ID被發現只能看到他的物品,或看到他的+所有其他? – AdrianBR

回答

4
SELECT products.* from products 
INNER JOIN stores 
ON stores.id = products.store_id 
AND (stores.user_id = <supplied userid> OR stores.is_active = 1) 
+0

這返回活躍的商店以及更新 – AdrianBR

+0

這似乎工作得很好,它非常簡單!謝謝! –

+0

很高興幫助!我只是使用了查詢中的邏輯。這真的很簡單:) –

0

兩個內部聯接應該做的伎倆。

SELECT products.* from products 
INNER JOIN stores owners_store ON (owners_store.id = products.store_id AND owners_store.user_id = <supplied userid>) 
INNER JOIN stores user_stores ON (user_stores.id = products.store_id AND user_stores.is_active = 1)