Получить результаты SQL, сгруппированные по категориям - PullRequest
0 голосов
/ 03 января 2019

с довольно низким уровнем в 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

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Так, как предложили scaisEdge и jStaff, я создал промежуточную таблицу, в которой храню идентификатор своих двух таблиц.

Теперь я получаю список результатов в этой форме, что неплохо:

[0]
- Title 1
- Cat 1

[1]
- Title 1
- Cat 2

[2]
- Title 2
- Cat 1

[3]
- Title 2
- Cat 3

[4]
- Title 3
- Cat 2

[5]
- Title 3
- Cat 3

Возможно ли теперь сгруппировать эти результаты по категориям для создания этой формы, возможно, с помощью GROUP BY?:

[Cat 1]
- Title 1
- Title 2

[Cat 2]
- Title 1
- Title 3

etc...

Заранее спасибо.

0 голосов
/ 03 января 2019

Лучше создать базу данных, чтобы создать новую таблицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...