SQL嵌套选择固定

时间:2015-12-28 23:11:10

标签: php mysql sql

我有两张桌子,几小时和几天,几小时存储一天专业的时间。 天,存储预约时间,

table_hours

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 

table_days

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

我尝试了以下查询,但没有效果。

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

结果我希望得到专业的所有结果和比赛时的日期

table_result

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

3 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分: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

答案 2 :(得分:1)

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

table_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 

table_days

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