Поскольку вы используете агрегат в своем запросе (GROUP_CONCAT
), ваш запрос группируется.Поскольку у вас нет предложения group by
, ваша группа - это полный набор результатов (следовательно, видны все теги, использованные автором).Поскольку MySQL позволяет использовать несгруппированные столбцы в сгруппированных выражениях, вы не получаете сообщение об ошибке, но не получаете запрос, который вам нужен.
Чтобы получить правильные результаты, вам необходимосгруппируйте ваш запрос по thread.id
.
select
thread.title,
thread.id as thread_id,
thread.content,
author.username,
author.id as author_id,
group_concat(distinct tag.name order by tag.name desc separator ',') as tags
from thread
join thread_tags ON thread.id = thread_tags.thread_id
join tag ON thread_tags.tag_id = tag.id
join author_threads ON thread.id = author_threads.thread_id
join author ON author_threads.author_id = author.id
where author.id = '12'
group by thread.id
limit 0 , 30
. Это должно работать в MySQL, хотя это не ANSI-совместимый SQL, поскольку вы используете несгруппированные столбцы в предложении select
без агрегирования.Вы можете оставить все как есть или написать более совместимый SQL и использовать что-то вроде max
вокруг всех столбцов, кроме thread.id
.Это не будет выглядеть красиво, но будет соответствовать.
SELECT
max(thread.title) as title,
thread.id as thread_id,
max(thread.content) as content,
max(author.username) as username,
max(author.id) as author_id,
group_concat(distinct tag.name order by tag.name desc separator ',') as tags
from thread
join thread_tags ON thread.id = thread_tags.thread_id
join tag ON thread_tags.tag_id = tag.id
join author_threads ON thread.id = author_threads.thread_id
join author ON author_threads.author_id = author.id
where author.id = '12'
group by thread.id
LIMIT 0 , 30
Количество ответов
Вышеуказанный запрос (вместе с вашими исходными запросами) подходит только для получения списка тегов.Вы можете написать эквивалентный запрос для получения количества ответов (при условии, что ответы не являются вложенными, и в этом случае вам придется использовать любые возможности рекурсивного запроса, которые предоставляет MySQL, с которыми я не знаком), но для извлечения обоихв одном запросе требуются подзапросы:
select
thread.title,
thread.id as thread_id,
thread.content,
author.username,
author.id,
(select group_concat(distinct tag.name order by tag.name separator ',')
from thread_tags
join tag on tag.id = thread_tags.tag_id
where thread_tags.thread_id = thread.id) as tags,
(select count(1) from thread_replies where thread_id = thread.id) as reply_count
from thread
join author_threads ON thread.id = author_threads.thread_id
join author ON author_threads.author_id = author.id
where author.id = '12'
LIMIT 0 , 30
Я удалил group by
из этого запроса, потому что наш агрегат был перемещен в подвыбор, то есть внешний запрос больше не группируется.