我的应用程序实现带有标签的注释。检索注释时,可以通过其他表格定义的手动设置顺序对其进行排序。例如,如果有两个注释,并且两个注释都标记有两个标记:“功能”和“有用”,则它们的检索顺序由第三张表设置:顺序。
如果为两个注释分配了相同的两个标签(“功能”和“有用”),则可以按标签名称进行检索,并且两个查询之间的顺序将有所不同。
数据库的结构为:
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 |
+----+---------------------+-------+
如何在不订购此处的情况下检索评论?
答案 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