[英]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.