Получение результатов SQL, сгруппированных по категориям

имея довольно низкий уровень в sql, я прихожу за вашей помощью, потому что я заблокирован.

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

Схематично таблица категорий выглядит так:

|    Name    |  id |
|    Cat1    |  1  |
|    Cat2    |  2  |
|    Cat3    |  3  |

И в таблице артиклей:

|     Title     |   id  |       Categories      |
|     Title1    |   1   |         [1,2]         |
|     Title2    |   2   |         [1,3]         |
|     Title3    |   3   |         [2,3]         |

В настоящее время я получаю свои статьи следующим образом:

SELECT *
FROM articles a
JOIN categories c
ON JSON_CONTAINS(a.categories, CAST(c.id AS CHAR))

Затем в php группирую их по категориям. Но я считаю, что это решение не очень чистое.

Поэтому я хотел знать, может ли SQL-запрос получить список статей, уже сгруппированных по категориям таким образом:

Cat1
- Статья 1
- Статья 2

cat2
- Статья 1
- Статья 3

Cat3
- Статья 2
- Статья 3

вы не должны использовать значения, разделенные запятыми, в столбцах .. вы должны нормализовать связанные данные

ScaisEdge 03.01.2019 18:40

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

Chiraq 03.01.2019 18:50

затем опубликуйте правильную структуру данных, чтобы можно было правильно ответить на ваш вопрос

ScaisEdge 03.01.2019 18:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучше создать новую таблицу ArticleCategories, в которой перечислены все категории статей:

ArticleID, CatID

Если у ArticleID может быть несколько CatID ...

Теперь вы можете связать несколько категорий с одной статьей и легко искать в этой новой базе данных с помощью SQL корреляции между категориями и статьями.

SELECT    c.category, STRING_AGG(a.title, ',')
FROM      articles a
LEFT JOIN articleCategories ac
       ON a.id = ac.articleID
LEFT JOIN categories c
       ON c.id = ac.categoryID
GROUP BY  c.category

Вот как многие люди решают этот вопрос. Есть, конечно, и другие способы, но они простые и эффективные.

jStaff 03.01.2019 18:49

Вношу доработки, потом возвращаюсь к вам, спасибо за ответ!

Chiraq 03.01.2019 18:52

Другие вопросы по теме