6

すべてのユーザーを対応するユーザー クラスで一覧表示したいと考えています。これが私のテーブルの簡略化されたバージョンです

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    |
+---------+---------------------+

前もって感謝します

4

2 に答える 2

6

これは最適な設計ではありませんが、必要なクエリは次のとおりです。

SELECT  user_id, GROUP_CONCAT(class_name)
FROM    users
JOIN    classes
ON      FIND_IN_SET(class_id, user_class)
GROUP BY
        user_id
于 2010-03-25T15:11:15.937 に答える
3

これは、データベースの正規化の規則に違反しています。コンマ区切りのリストに多対多の値を格納しないでください。代わりに、フィールド user_id と class_id を持つ別のテーブル user_classes を作成します。このテーブルは、単に他の 2 つのクラス間のリンク テーブルとして使用されます。この後、GROUP_CONCAT を使用して、必要なことを行うことができます。

于 2010-03-25T14:57:53.660 に答える