mysql GROUP_CONCAT

Я хочу перечислить всех пользователей с их corropsonding пользовательским классом. Вот упрощенные версии моих таблиц

CREATE TABLE users (
    user_id INT NOT NULL AUTO_INCREMENT,
    user_class VARCHAR(100),
    PRIMARY KEY (user_id)
);
INSERT INTO users VALUES
    (1, '1'),
    (2, '2'),
    (3, '1,2');
CREATE TABLE classes (
    class_id INT NOT NULL AUTO_INCREMENT,
    class_name VARCHAR(100),
    PRIMARY KEY (class_id)
);
INSERT INTO classes VALUES
    (1, 'Class 1'),
    (2, 'Class 2');

И это - оператор запроса, который я пытаюсь использовать, но только возвращаю первый пользовательский класс соответствия и не связанный список, как надеялся.

SELECT user_id, GROUP_CONCAT(DISTINCT class_name SEPARATOR ",") AS class_name
FROM users, classes
WHERE user_class IN (class_id)
GROUP BY user_id;

Эффективная выходная мощность

+---------+------------+
| user_id | class_name |
+---------+------------+
|       1 | Class 1    |
|       2 | Class 2    |
|       3 | Class 1    |
+---------+------------+

Требуемый вывод

+---------+---------------------+
| user_id | class_name          |
+---------+---------------------+
|       1 | Class 1             |
|       2 | Class 2             |
|       3 | Class 1, Class 2    |
+---------+---------------------+

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

6
задан zendar 25 March 2010 в 15:02
поделиться

2 ответа

Это не лучший дизайн, но вот запрос, который вам нужен:

SELECT  user_id, GROUP_CONCAT(class_name)
FROM    users
JOIN    classes
ON      FIND_IN_SET(class_id, user_class)
GROUP BY
        user_id
6
ответ дан 10 December 2019 в 02:45
поделиться

Это нарушает правила нормализации базы данных. Не храните значения "многие ко многим" в списке, разделенном запятыми. Вместо этого создайте другую таблицу user_classes с полями user_id и class_id. Эта таблица просто используется как таблица связей между двумя другими классами. После этого вы можете использовать GROUP_CONCAT, чтобы делать то, что вы хотите.

3
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: