簡體   English   中英

3個表mySQL與來自同一列的2個WHERE子句連接 - 只有一個工作

[英]3 table mySQL join with 2 WHERE clauses from the same column - only one working

我通過將SQL中存儲的藝術家,曲目標題和mixname與每個mp3的實際文件名相匹配,從我們的cms中提取出一個獨特的5位數曲目id。

我需要的id和曲目標題都存儲在table1中 artist和mixname存儲在同一列的表3中,從表2中的不同中間ID鍵入(attribute_id'17'對應mixname,'18'對應藝術家。)

因此,我認為我需要CASE語句兩次審查相同的數據,但目前,它只處理案例1或案例2 - 從不兩者。

**table1**  
id | title
12345 | My Way

**table2**      
item_id | attribute_id | value_id

12345 | 17 | 54320
12345 | 18 | 54321

**table3**      
id | value_varchar  

54320 | Classic Swing Remix
54321 | Frank Sinatra   

而實際的SQL查詢:

SELECT table1.id
FROM (table1 LEFT OUTER JOIN table2 on table1.id = table2.item_id)
RIGHT OUTER JOIN table3 on table2.value_id = table3.id
WHERE table1.title = '{$title}'
AND CASE
WHEN table2.attribute_id = '17' THEN table3.value_varchar = '{$mixname}'
WHEN table2.attribute_id = '18' THEN table3.value_varchar = '{$artist}'
END
ORDER BY table1.id DESC

您的SQL語句中存在一些缺陷。 首先:不要混合左外連接。 這令人困惑。 留在左外連接 - 大多數人習慣這些。

您將外連接table2保留到table1。 好的,到目前為止。 你右邊連接table3,到底是什么? 它沒有任何權利! 我想你的意思是左外加入。

但是,table2和table3仍然是外連接的,所以如果你在這些表中找不到匹配的記錄,就會添加一個虛擬記錄,其中所有值都是NULL。 然后在WHERE子句中詢問這些表的屬性。 它們可以為NULL。 因此,您可以有效地將外部聯接轉換為內部聯接,因為您刪除了所有其他記錄。 將標准放在ON子句中,而不是在WHERE子句中,以使其起作用。

您可以使用帶有having子句的group by語句來執行此操作:

select table1.id
from table1 join
     table2
     on table1.id = table2.item_id join
     table3
     on table2.value_id = table3.id
where table1.title = '{$title}'
group by table1.id
having sum(table2.attribute_id = '17' and table3.value_varchar = '{$mixname}') > 0 and
       sum(table2.attribute_id = '18' and table3.value_varchar = '{$artist}') > 0;

having子句中的第一個條件計算屬性17與mixname匹配的行數。 你想要至少一個,因此> 0 對於屬性18,第二個做同樣的事情。

我不確定為什么你的原始查詢混合了左外連接和右外連接。 這似乎沒必要。 您需要匹配行才能獲取屬性值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM