Multiple JOIN не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 27 ноября 2018

Мое приложение реализует комментарии с тегами.При получении комментариев их можно упорядочить, задав вручную порядок, который определяется дополнительной таблицей.Например, если есть два комментария и оба помечены двумя тегами: «признакам» и «полезным», порядок их поиска определяется третьей таблицей: Порядок.

Если двум комментариям назначены одинаковые два тега («избранные» и «полезные»), их можно получить по имени тега, и их порядок будет различным для двух запросов.

Структурабаза данных:

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 голосов
/ 27 ноября 2018

Я думаю, вы просто хотите условия в предложении 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
...