简体   繁体   中英

How do you select multiple row values as column values in MYSQL?

I have two tables linked by ID (simplified example below):

Table 1

ID     NAME
1      John
2      Frank

Table 2

ID     DAY     TIME_FROM    TIME_TO
1      Sun     8:00         15:00
1      Mon     8:00         15:00
1      Tue     NULL         NULL
1      Wed     NULL         NULL
1      Thu     NULL         NULL
1      Fri     8:00         15:00
1      Sat     8:00         15:00
2      Sun     8:00         15:00
...

What I would like is a query to return ideally the abbreviated days for each ID in one field like this:

ID     NAME    DAYS 
1      John    S M F S 
2      Frank   S M T W T F S

or perhaps:

ID     NAME    SUN    MON   TUE    
1      John    TRUE   TRUE  FALSE
2      Frank   TRUE   TRUE  TRUE

Prefer the first solution if its possible.

Use GROUP_CONCAT() function

SELECT t1.ID,t1.NAME,
       GROUP_CONCAT(`DAY` SEPERATOR ' ') as `DAYS`
FROM table1 t1
INNER JOIN table2 t2
ON t1.ID=t2.ID
GROUP BY t1.ID,t1.NAME

Try this:

  1. For first solution:

     SELECT T1.ID,T1.Name, GROUP_CONCAT(T2.`DAY` SEPARATOR ' ') as Day FROM Table1 T1 JOIN Table2 T2 ON T1.Id=T2.Id GROUP BY T1.ID,T1.Name 

    Result:

     ID NAME DAY 1 John Thu Fri Sat Sun Mon Tue Wed 2 Frank Sun 

    NB: Using 3 letters to avoid the confusion between Sat and Sun . See the result in SQL Fiddle .

  2. For second solution:

     SELECT T1.ID,T1.Name, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Sun') THEN 'TRUE' ELSE 'FALSE' END) as SUN, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Mon') THEN 'TRUE' ELSE 'FALSE' END) as MON, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Tue') THEN 'TRUE' ELSE 'FALSE' END) as TUE, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Wed') THEN 'TRUE' ELSE 'FALSE' END) as WED, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Thu') THEN 'TRUE' ELSE 'FALSE' END) as THU, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Fri') THEN 'TRUE' ELSE 'FALSE' END) as FRI, MAX(CASE WHEN (COALESCE(TIME_FROM,TIME_TO) IS NOT NULL AND `DAY` ='Sat') THEN 'TRUE' ELSE 'FALSE' END) as SAT FROM Table1 T1 JOIN Table2 T2 ON T1.Id=T2.Id GROUP BY T1.ID,T1.Name 

    Explanation:

    COALESCE will be useful to check both TIME_FROM and TIME_TO are NULL .

    Result (with the given example):

     ID NAME SUN MON TUE WED THU FRI SAT 1 John TRUE TRUE FALSE FALSE FALSE TRUE TRUE 2 Frank TRUE FALSE FALSE FALSE FALSE FALSE FALSE 

    Result in SQL Fiddle .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM