sql >> データベース >  >> RDS >> Mysql

MySQLgroup_concatとselectinsideselect

    これがあなたが探しているものであるか、またはあなたが始めることができると私は信じています:

    SELECT
        t.therapist_name,
        dl.day,
        GROUP_CONCAT(DISTINCT dl.name SEPARATOR ',') AS locations
    FROM
        therapists t 
        LEFT JOIN days_location dl ON dl.therapist_id = t.id
        LEFT JOIN location l ON dl.location_id = l.id
    GROUP BY t.therapist_name, dl.day
    

    therapists.id = 1の場合 これで結果が得られるはずです:

    +----------------+-----------+-----------------------+
    | therapist_name |    day    |       locations       |
    +----------------+-----------+-----------------------+
    | Therapist 1    | monday    | Location 1,Location 2 |
    | Therapist 1    | wednesday | Location 3            |
    | Therapist 1    | friday    | Location 1            |
    +----------------+-----------+-----------------------+
    

    dayを連結する必要がある場合 locations 次に、単純なCONCAT()を使用します。 :

    SELECT
        therapist_name,
        CONCAT(day, '(', locations, ')') AS locations
    FROM (  
        SELECT
            t.therapist_name,
            dl.day,
            GROUP_CONCAT(DISTINCT dl.name SEPARATOR ',') AS locations
        FROM
            therapists t 
            LEFT JOIN days_location dl ON dl.therapist_id = t.id
            LEFT JOIN location l ON dl.location_id = l.id
        GROUP BY t.therapist_name, dl.day
        ) t
    GROUP BY therapist_name, locations
    

    出力は次のようになります:

    +----------------+-------------------------------+
    | therapist_name |           locations           |
    +----------------+-------------------------------+
    | Therapist 1    | monday(Location 1,Location 2) |
    | Therapist 1    | wednesday(Location 3)         |
    | Therapist 1    | friday(Location 1)            |
    +----------------+-------------------------------+
    

    セラピストごとにすべてを1つの行にグループ化する必要がある場合は、GROUP_CONCAT() もう一度。

    コメント後に編集

    SELECT
        therapist_name,
        GROUP_CONCAT( CONCAT(day, '(', locations, ')') SEPARATOR ',' ) AS locations
    FROM (      
        SELECT
                t.therapist_name,
                dl.day,
                GROUP_CONCAT(DISTINCT dl.name SEPARATOR ',') AS locations
        FROM
                therapists t 
                LEFT JOIN days_location dl ON dl.therapist_id = t.id
                LEFT JOIN location l ON dl.location_id = l.id
        GROUP BY t.therapist_name, dl.day
        ) t
    GROUP BY therapist_name
    

    私はコードをテストしていないので、微調整するためのいくつかの小さな間違いがあるかもしれません。 atmをテストする方法はありません。




    1. Symfony2:国ごとに都市を一覧表示

    2. SQLServerでDELETEパススルークエリを実行する方法

    3. チャートの種類の紹介

    4. グループごとに不足している日付を埋める