多连接不返回预期结果

xt0899hw  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(225)

我的应用程序实现带有标记的注解。在检索注解时,可以通过手动设置由附加表定义的顺序来对注解进行排序。例如,如果有两个注解,并且都用两个标记“featured”和“usable”标记,则它们的检索顺序由第三个表设置:order。
如果给两个注解分配了相同的两个标记(“featured”和“usiver”),则可以按标记名检索它们,并且它们的顺序在两个查询之间是不同的。
数据库的结构是:

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     |
+----+---------------------+-------+

我怎样才能检索评论而不在这里排序?

643ylb08

643ylb081#

我想你只是想了解 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

相关问题