• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Вопрос: Сортировка внутри Group_concat в Mysql

  • Автор темы DikMax
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

DikMax

Есть несколько таблиц:
- publications (id, date, title, text, ...)
- tags (id, tag)
- tags_in_publications (id, publicationid, tagid)
остальные не существенны

И есть 2 запроса:
(1) выборка 1 публикации
(2) выборка всех публикаций

В каждом запросе кроме основных полей должно выбираться еще одно поле в котором перечислены все теги связанные с новость отсортированные по алфавиту разделенные пробелами.

Запрос (1) путем долгих экпериментов удалось написать:

Код:
SELECT p.id, p.`title`, DATE_FORMAT(p.`date`, '%e.%c.%Y') AS `date`, t.tags AS tags, n.shorttext AS 
`short`, `text` AS `long`
FROM publications AS p
LEFT JOIN news AS n ON p.connectid = n.id
LEFT JOIN (
SELECT tp.publicationid AS id, GROUP_CONCAT(t.tag SEPARATOR ' ') AS tags
FROM (SELECT * FROM tags ORDER BY tag ASC) AS t
LEFT JOIN tags_in_publications AS tp ON tp.tagid = t.id
WHERE tp.publicationid = 15
GROUP BY tp.publicationid
ORDER BY t.tag ASC) AS t ON t.id = p.id
WHERE p.id = 15

Причем если оставить только 1 (любой) ORDER BY строка получается неотсортированной

Попытки написать таким же образом запрос (2) успехом не увенчались:
Код:
SELECT SQL_CALC_FOUND_ROWS p.id, p.`date`, p.title, t.tags
FROM publications p
LEFT JOIN (
SELECT tp.publicationid AS id, GROUP_CONCAT(t.tag SEPARATOR ' ') AS tags
FROM (SELECT * FROM tags ORDER BY tag ASC) AS t
LEFT JOIN tags_in_publications AS tp ON tp.tagid = t.id
GROUP BY tp.publicationid
ORDER BY t.tag ASC) AS t ON p.id = t.id
WHERE category = 1
LIMIT 0,25

Вот собственно вопрос: как это нужно написать?
 
M

MajestiC

А зачем всё пихать в 1 запрос? Не было идеи тэги отдельно выбирать, религия не позволяет сделать доп 25 запросов? MySQL просто обожает оптимизировать такие длинные запрос с group_concat и subselectами.

Впринципе напишите GROUP_CONCAT(t.tag SEPARATOR ' ' ORDER BY t.tag)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!