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:
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 .
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.