3

mysqlを介して複数の行を1つの行に結合するにはどうすればよいですか?

例 :

学生テーブル

Sno.| Name  |  Subjects
1.  | ABC   |  English
2.  | ABC   |  Mathematics
3.  | ABC   |  Science
4.  | FMC |  French
5.  | ABC   |  Russian
6.  | JBC   |  French

今、私はこの形式でそれが欲しい

Sno.| Name |   Sub1 |  Sub2 | Sub3 |  Sub4 |
1.  | ABC |   Eng  |  Maths| Science| Russian
2.  | FMC |    French| Null| Null   | Null
3.  | JBC |   French| Null | Null   | Null

実際にどうやってやるのかわからない?そして、ビューまたはテーブルを作成しますか?

眺めはいいと思います。

4

4 に答える 4

3

PHPと一緒にコンマ区切りの値を分割するのがおそらく最善のアプローチであるという他の回答に同意しGROUP_CONCATますが、他の理由でPure SQLを介して提案した出力が必要な場合は、次のいずれかの方法を提案します。

1.自己結合

SELECT  t1.Name, 
        MIN(t1.Subject) AS Sub1,
        MIN(t2.Subject) AS Sub2,
        MIN(t3.Subject) AS Sub3,
        MIN(t4.Subject) AS Sub4
FROM    Students t1
        LEFT JOIN Students T2 
            ON t1.Name = t2.Name 
            AND t2.Subject > t1.Subject
        LEFT JOIN Students T3 
            ON t2.Name = t3.Name 
            AND t3.Subject > t2.Subject
        LEFT JOIN Students T4 
            ON t3.Name = t4.Name 
            AND t4.Subject > t3.Subject
GROUP BY t1.Name;

2.ROW_NUMBERタイプ関数を使用して集計します

SELECT   Name,
         MAX(IF(RowNum = 1,Subject, NULL)) AS Sub1,
         MAX(IF(RowNum = 2,Subject, NULL)) AS Sub2,
         MAX(IF(RowNum = 3,Subject, NULL)) AS Sub3,
         MAX(IF(RowNum = 4,Subject, NULL)) AS Sub4
FROM     (    SELECT   Name,
                       Subject,
                       @r:= IF(@Name = Name, @r + 1, 1) AS RowNum,
                       @Name:= Name AS Name2
              FROM    Students,
                      (SELECT @Name:='') n,
                      (SELECT @r:= 0) r
              ORDER BY Name, Sno
          ) t
GROUP BY Name
于 2012-07-16T19:59:39.733 に答える
1

以下のクエリを使用して、名前とその件名を取得します。

SELECT Name, GROUP_CONCAT(Subjects) AS List
FROM myTable
GROUP BY Name

implode次に、PHPでは、被写体を印刷するための関数を使用できます。

お役に立てれば。

sqlfiddleでのデモ

于 2012-07-16T18:02:56.553 に答える
0

GROUP BYとGROUP_CONCATを使用してみてください:

SELECT Name, GROUP_CONCAT(Subjects) AS Subjects_list
FROM students_table
GROUP BY Name

次に、レコードのフェッチ中にPHP関数explodeを使用して、Subjects_list列に格納されているさまざまな値を取得します。

于 2012-07-16T17:35:31.317 に答える
0

かわいくない!

上記のソリューションを使用するには、次のようにします。

SELECT 
  Sno, 
  Name,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 1), ',', -1), '') AS Sub1,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 2), ',', -1), '') AS Sub2,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 3), ',', -1), '') AS Sub3,
  NULLIF(SUBSTRING_INDEX(SUBSTRING_INDEX(all_subjects, ',', 4), ',', -1), '') AS Sub4
FROM (
  SELECT Sno, Name, CONCAT(GROUP_CONCAT(Subjects ORDER BY Sno),',,,') AS all_subjects FROM table GROUP BY name
) inner_sel
;

あなたの要求は、 4つを超える主題は決して存在できないという仮定につながります。NULLまた、4つの主題について言及されていない場合も必要です。

ある種の要求は、強制されたSQLコードにつながります。これは、通常、SQLが対象としているものです。

上記を説明するために:を使用しGROUP_CONCAT、次にそれを再び細かく分割します。要素は4つ未満である可能性があるため、コンマ(',,,')で埋めます。次に、連結された文字列内の位置に従って各ピースを分割し、NULL空の場合はで戻ります。

これがかわいらしさの点で私のより良い答えの1つであるとは言えません。お役に立てば幸いです。

于 2012-07-16T18:15:11.730 に答える