2013-06-06 70 views
0

我有一個標籤表,通過連接表 - ID,姓名,owner_id(owner_id是FK用戶)SQL查詢 - 獲取基於一個條件,從表中的行,並基於另一條件

和user_tags表 - user_id,tag_id(用戶之間的鏈接表用戶之間共享這些標籤 - 即,可以訪問該標籤但不是所有者的用戶)標籤

我有一個查詢,可以通過連接user_tags表:

SELECT tags . * 
FROM tags 
JOIN user_tags ON user_tags.user_id =2 
AND user_tags.tag_id = tags.id 
LIMIT 0 , 30 

但是在同樣的查詢中,我還想選擇selec t標籤WHERE tags.owner_id = 2,通過鏈接表(user_tags)獲取與該用戶共享的所有標籤以及用戶擁有的標籤(tags.owner_id = user_id)。

如果我包括WHERE tags.owner_id = 2後加入,它只返回結果,其中tags.owner_id = 2

如果我包括或tags.owner_id = 2,我得到的所有結果的重複。

如果我發表聲明SELECT DISTINCT... OR tags.owner_id = 2我最終得到了正確的結果集,但我不確定這是以條件方式執行此操作的正確方法。

有沒有更好的方法/最佳實踐?

另外,爲什麼做了一個連接的結果回報倍數(即爲什麼SELECT DISTINCTGROUP BY必要?

謝謝。

編輯澄清結構的

+1

您可以爲表添加DDL嗎?我很確定user_tags是一個橋表。 tags.owner_id是一個外鍵嗎?知道你的數據關係好一點會有幫助。 – scottb

回答

1

我不會使用user_tags.user_id作爲連接條件的一部分,只要在where子句中指定兩個條件以使你的意圖更清楚。但是要回答你的問題,是的,如果一個tags.id可以是DISTINCT,那麼你需要使用DISTINCT來重定義標籤與許多user_tags關聯。 tag_id

SELECT DISTINCT tags.* 
FROM tags 
JOIN user_tags ON tags.id = user_tags.tag_id 
WHERE user_tags.user_id = 2 
OR user_tags.owner_id = 2 
LIMIT 0,30