我在选择中使用了选择,如下所示:
SELECT id,
(
SELECT name FROM xxx WHERE xxx
) as y
FROM xxx
但是这个y是空的。因此,整个查询返回null。如果它等于null,我希望这个y为0,所以不要改变应返回多个元组的整个查询的结果。
这是我的完整查询:
SELECT id, begin, end, location_id, out_location_id, lat, lng, out_lat, out_lng, LEFT(TIMEDIFF(end, begin), 5) as duration,
(
SELECT LEFT(TIMEDIFF(end, begin), 5)
FROM timeslots l
WHERE user_id = '.$userId.'
AND type = '.Timeslot::LUNCH.'
AND parent_id = t.id
) as lunch,
(
SELECT LEFT(TIMEDIFF(end, begin), 5)
FROM timeslots o
WHERE user_id = '.$userId.'
AND type = '.Timeslot::OVERTIME.'
AND parent_id = t.id
) as overtime
FROM timeslots t
WHERE user_id = '.$userId.'
AND approved = 1
AND type = '.Timeslot::DAY.'
AND DATE(begin) >= "'.$startDay.'"
AND DATE(end) <= "'.$endDay.'"
ORDER BY begin
我尝试过COALESC(y,0)和IFNULL(y,0),但它不起作用:/
感谢您的帮助
我刚注意到,当我删除第一个子查询时,它可以工作!所以这意味着问题来自第一个子查询,而不是两者。更改整个查询结果的是行类型= Timeslot :: LUNCH(为2)。但是在第二个子查询中,我有Timeslot :: OVERTIME这是3,所以它是相同的,但它正在工作...
答案 0 :(得分:0)
评论太长了。
SELECT
中的子查询称为标量子查询。它们总是返回一列,最多一行。如果它们没有返回任何行,则值为NULL
。
他们不过滤结果集中的行。就这么简单。
换句话说,SELECT
中两个子查询中的 nothing 会影响返回的行数。它们仅影响该特定列的值。