SQL嵌套选择已修复


SQL nested select fixed

我有两个表,小时和天,小时存储专业人员一天中可用的小时。天,存储预订时间,

表_小时

id  | begin   | end    | profesional 
1   | 09:00   |  10:00 | 1 
2   | 10:00   |  11:00 | 1 
3   | 11:00   |  12:00 | 1 
4   | 13:00   |  14:00 | 1 
5   | 14:00   |  15:00 | 1 
6   | 09:30   |  10:30 | 2 
7   | 13:00   |  14:30 | 2 
8   | 14:30   |  15:30 | 2 

表_日期

id  | hour_id | day
1  | 1        |20151201 
2  | 3        |20151201 
3  | 6        |20151201 
4  | 2        |20151205 
5  | 7        |20151205 
6  | 8        |20151205

I、 尝试了以下查询,但没有成功。

SELECT *, (SELECT day from days where hours.id = days.hours_id and day = '20151201') as 'day' 
FROM hours 
where profesional = 1 

因此,我想从专业人士那里得到所有结果,并在匹配的日期如下

表_结果

id  | begin | end    | profesional | day
1   | 09:00 |  10:00 | 1           |20151201
2   | 10:00 |  11:00 | 1           |NULL
3   | 11:00 |  12:00 | 1           |20151201
4   | 13:00 |  14:00 | 1           |NULL
5   | 14:00 |  15:00 | 1           |NULL

使用LEFT JOIN获取第一个表中的所有行,当没有匹配的行时,返回第二个表中列中的NULL

SELECT h.*, d.day
FROM hours AS h
LEFT JOIN days AS d ON h.id = d.hours_id AND d.day = '20151201'
WHERE h.profesional = 1
SELECT table_hours.id, table_hours.begin, table_hours.end, table_hours.professional, table_day.day  
FROM table_day LEFT JOIN table_hours ON  table_day.id=table_hours.id AND table_day.day= '20151201'
Where day= professional=1

我想,您已经从其他答案中得到了解决方案。但我只想指出另一件事,你设置数据库的方式不对。不将hour_id保留在days表中,而将day_id保留在hours表中。从长远来看,它应该可以减少数据库中的行数,并帮助您节省存储空间。所以它可以是这样的:

表_小时

id  | day_id  | begin   | end    | profesional 
1   | 1       | 09:00   |  10:00 | 1 
2   | 2       | 10:00   |  11:00 | 1 
3   | 1       | 11:00   |  12:00 | 1 
4   | 3       | 13:00   |  14:00 | 1 
5   | 3       | 14:00   |  15:00 | 1 
6   | 1       | 09:30   |  10:30 | 2 
7   | 2       | 13:00   |  14:30 | 2 
8   | 2       | 14:30   |  15:30 | 2 

表_日期

id  | day
1   | 20151201 
2   | 20151205 

现在像一样更改SQL

SELECT h.*, d.day
FROM hours AS h
LEFT JOIN days AS d ON h.day_id = d.id AND d.day = '20151201'
WHERE h.profesional = 1