mysql - 试图构造一个左连接来查询多对多关系中的数据库表

标签 mysql sql

只是 mySQL 查询有问题。基本上我有三个表

  1. 标签
  2. 目录列
  3. 目录列标签

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/

相关文章:

mysql - 通过保留表中的最小行来删除重复记录

python - SQL 查找非零的最小值

SQL Server : How to get/save result of "statistics profile"

sql - 不带 '?'的JDBC RDD查询语句

php - 生成一个长度为 65,535 字节的文本文件

mysql - C、如何将字符串保存到二进制文件中?

mysql - 我可以在 MySQL 存储过程中覆盖 IN 参数吗

php - 关于结合 mod_rewrite 的 xml 站点地图的问题!

mysql - 多连接mysql查询执行时间太长

mysql - 在Mysql中跨列使用stddev