[英]Trying to construct a Left join to query a database table in a many to many relationship
只是遇到mySQL
查詢問題。 基本上我有三張桌子
directorycolumn和tag之間存在many to many
關系,因此directorycolumntags表充當聯結表。 我正在嘗試構建一個查詢,它將使用其他兩個表之間的left join
從標記表返回標記名稱。
這是我的查詢:
SELECT t.name FROM tag t
LEFT JOIN directorycolumntags dct
ON t.id = dct.tag_id
AND dct.directorycolumn_id = '178'
但是,不是僅僅返回與id為178的列相關聯的標簽,而是返回所有標簽。任何人都可以幫我這個嗎?
這是directorycolumntags
表中的數據:
id directorycolumn_id tag_id description created
29 178 1 \N 2014-11-05 17:31:22
30 178 2 \N 2014-11-05 17:31:30
31 178 3 \N 2014-11-05 17:31:42
這是tag
表中的數據:
id name description
31 Tag 1 This is Tag 1
32 Tag 2 This is Tag 2
33 Tag 3 This is Tag 3
34 Tag 4 This is Tag 4
35 Tag 5 This is Tag 5
這是我上述查詢的結果:
name
Tag 1
Tag 2
Tag 3
Tag 4
Tag 5
如果我將查詢更改為INNER JOIN
,如下所示:
SELECT t.name FROM tag t
JOIN directorycolumntags dct
ON t.id = dct.tag_id
AND dct.directorycolumn_id = '178'
我沒有結果。 當我執行此查詢時,這很奇怪
SELECT * FROM directorycolumntags WHERE directorycolumn_id = 178
我得到以下結果:
id directorycolumn_id tag_id description created
29 178 1 \N 2014-11-05 17:31:22
30 178 2 \N 2014-11-05 17:31:30
31 178 3 \N 2014-11-05 17:31:42
當您執行LEFT JOIN
您將從LEFT表中獲取所有行,並從右表中獲取不匹配行的NULL值
如果您想要列178的所有標記值,只需使用INNER JOIN
SELECT t.name FROM tag t
JOIN directorycolumntags dct
ON t.id = dct.tag_id
AND dct.directorycolumn_id = '178'
根據對該問題所做的編輯,tag.id和directorycolumntags.tag_id上的連接不會產生任何結果,因為沒有匹配。
我認為你需要這樣做,以獲得預期的結果
SELECT t.name FROM tag t
JOIN directorycolumntags dct
ON concat('Tag ',dct.tag_id) = t.name
AND dct.directorycolumn_id = 178
您正在使用Where
子句將Left Join
更改為Inner Join
。
將Where
語句移動到On
條件。
SELECT t.name FROM tag t
LEFT JOIN directorycolumntags dct
ON t.id = dct.tag_id
AND dct.directorycolumn_id = '178'
編輯:根據@ RADAR的回復,他認為它應該是Inner Join
而不是Outer Join
是正確的。 這應該會告訴你你在尋找什么,不過,應該歸功於他:
SELECT t.name FROM tag t
JOIN directorycolumntags dct
ON t.id = dct.tag_id
WHERE dct.directorycolumn_id = '178'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.