簡體   English   中英

嘗試構造一個Left連接以查詢多對多關系中的數據庫表

[英]Trying to construct a Left join to query a database table in a many to many relationship

只是遇到mySQL查詢問題。 基本上我有三張桌子

  1. 標簽
  2. directorycolumn
  3. directorycolumntags

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.

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