sql >> Databáze >  >> RDS >> Mysql

MySQL group_concat s výběrem uvnitř select

Věřím, že toto je to, co hledáte, nebo by vám to mohlo pomoci začít:

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

Pro therapists.id = 1 toto by vám mělo přinést výsledky:

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

Pokud potřebujete zřetězit day s locations poté použijte jednoduchý 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

Výstup by měl vypadat takto:

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

Pokud to potřebujete seskupit vše do jednoho řádku pro každého terapeuta, můžete GROUP_CONCAT() znovu.

Upravit po komentářích :

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

Kód jsem netestoval, takže se mohou vyskytnout drobné chyby, které je třeba vyladit. Žádný způsob testování atm.




  1. Referenční tabulka SQL:Jak vytvářet a zapisovat základní dotazy

  2. SQL vs MySQL:Pravidla pro agregační operace a GROUP BY

  3. Použití OASIS-SVN a git pro řízení zdrojového kódu Access

  4. Seskupování klauzulí WHERE v Codeigniter