只是 mySQL
查询有问题。基本上我有三个表
- 标签
- 目录列
- 目录列标签
directorycolumn 和标签之间存在多对多
关系,因此 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
关于mysql - 试图构造一个左连接来查询多对多关系中的数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26763636/