多个JOIN不返回预期结果

时间:2018-11-27 14:08:36

标签: mysql sql join left-join

我的应用程序实现带有标签的注释。检索注释时,可以通过其他表格定义的手动设置顺序对其进行排序。例如,如果有两个注释,并且两个注释都标记有两个标记:“功能”和“有用”,则它们的检索顺序由第三张表设置:顺序。

如果为两个注释分配了相同的两个标签(“功能”和“有用”),则可以按标签名称进行检索,并且两个查询之间的顺序将有所不同。

数据库的结构为:

Comment:
- id
- text

Tag:
- id
- name

CommentTag:
- id
- tag_id (refernces Tag.id)
- comment_id (references Comment.id)

Order:
- id
- comment_id (references Comment.id)
- tag_id (references Tag.id)
- order

以下查询用于检索评论:

SELECT comment.* FROM comment

    INNER JOIN tag ON (comment.id = tag.comment_id)
    INNER JOIN commenttag ON (tag.tag_id = commenttag.id)
    LEFT OUTER JOIN order ON (comment.id = order.comment_id)
    WHERE (
        tag.name = "featured" AND
        (tag.id = order.tag_id OR order.comment_id IS NULL))

    ORDER BY order.order ASC

该查询在某些情况下会起作用。但是...分配给两个标签(“功能”和“有用”)但仅为单个标签设置顺序(“有用”)的注释不会返回给第二个标签(“功能”)查询。 只有两个标签都存在订购对象时,我才能使它工作。

评论表:

+----+----------------+
| id | text           |
+----+----------------+
| 1  | first comment  |
+----+----------------+
| 2  | second comment |
+----+----------------+

标签表:

+----+---------------+
| id | name          |
+----+---------------+
| 11 | featured      |
+----+---------------+
| 12 | useful        |
+----+---------------+

CommentTag表:

+----+---------------------+
| id | tag_id | comment_id |
+----+---------------------+
| 21 | 11     | 1          |
+----+---------------------+
| 22 | 11     | 2          |
+----+---------------------+
| 23 | 12     | 1          |
+----+---------------------+
| 24 | 12     | 2          |
+----+---------------------+

订单表:

+----+---------------------+-------+
| id | tag_id | comment_id | order |
+----+---------------------+-------+
| 23 | 12     | 1          | 6     |
+----+---------------------+-------+
| 24 | 12     | 2          | 3     |
+----+---------------------+-------+

如何在不订购此处的情况下检索评论?

1 个答案:

答案 0 :(得分:1)

我认为您只是想要ON子句中的条件,而不是WHERE子句中的条件:

SELECT c.*
FROM comment c JOIN
     tag t
     ON c.id = t.comment_id JOIN
     commenttag ct
     ON t.tag_id = ct.id AND t.name = 'featured' LEFT JOIN
     order o
     ON c.id = o.comment_id AND
        t.id = o.tag_id 
ORDER BY o.order ASC