对于不存在的行,Mysql返回null

时间:2013-09-19 12:33:22

标签: mysql isnull

我有以下代码:

while ($row = mysql_fetch_array($result)){    
    $que ='select SUM(price) from prices_adverts where advert_id="7" and room_type_id="54" and (date >= "2013-09-20" AND date <"2013-09-21") order by price';    
    $que ='select SUM(price) from prices_adverts where advert_id="7" and room_type_id="55" and (date >= "2013-09-20" AND date <"2013-09-21") order by price';    and etc    

    $res=mysql_query($que) or die();    
    $rw=mysql_fetch_row($res);    
    $price= $rw['0'];    
}    

这会返回一些记录,这些记录在数据库中有价格,而NULL表示$ price,记录不存在/当房间没有特定日期的价格时,表中不存在/ 所以我的问题是如何才能获得仅存在的记录的结果?我不需要价格的NULL值,是否有可能在外面访问$ price?怎么样?请帮助,谢谢

我可以解释一下我需要什么,这可以帮助你帮助我:) 上面我正在循环酒店房间,以检查特定时期的房间费用。比我需要绘制外部循环按钮,将访客转移到预订页面。但如果酒店的日期没有房价,我希望没有预订按钮。这就是为什么我需要弄清楚至少有一个房间价格在酒店或不..希望这有帮助

################################################## ######更新

第一个问题:我要带所有伦敦酒店的id-s

select id from adverts where town="London" limit 0, 5    

大于

for($i=0;$i<$num_rows;$i++){    
$row=mysql_fetch_row($result);    
echo echo_multy_htl_results($row[0]);    
}    

这个函数echo_multy_htl_results是:

select a.article_title, a.town, a.small_image, a.plain_text, a.star_rating, a.numberrooms, rta.room_type_id, rt.bg_room_type,a.longitude, a.latitude, a.link_name, a.id from adverts a, rooms_to_adverts rta,room_types rt where a.id = rta.advert_id and rta.advert_id="3" and rta.room_type_id=rt.id and rt.occupants>="1" group by rt.bg_room_type order by rt.occupants ASC    

它获取了html酒店广场和room_types_id-s的信息,并且它已经添加了鳕鱼..你会建议什么?

4 个答案:

答案 0 :(得分:1)

可能通过添加AND price IS NOT NULL

答案 1 :(得分:1)

手头的即时问题的解决方案可以是此查询:

select  SUM(price) 
from prices_adverts 
where advert_id="7" 
    and room_type_id="54"  -- notice, we are filtering on room type here
    and (date >= "2013-09-20" AND date <"2013-09-21") 
group by room_type_id -- this makes no rows appear when there are no rows found in this case
order by price    

当有相应的行时返回1行,没有时返回0行。

然而,您的问题似乎有所不同。你的运作方案似乎是这样的:

  1. 从DB(room_type_ids)
  2. 查询行
  3. 把它们放在一个循环中
  4. 每次迭代
  5. 运行查询
  6. 这很糟糕。数据库非常善于使用JOIN和其他适当的子句来解决这些问题。我建议使用这些功能,并在脑海中扭转局面。这样,您可以发出一个返回所需数据的查询。我相信这个可能是这样的查询,提供所有房型ID及其总价:

    select room_type_id, SUM(price) 
    from prices_adverts 
    where advert_id="7"  -- notice: no filtering for room_type_id this time
        and (date >= "2013-09-20" AND date <"2013-09-21") 
    group by room_type_id
    order by price    
    

    此查询列出了所有具有记录的room_type_ids,并且没有列出那些没有记录的room_type_ids,并且在每个不同的type_id旁边,它具有总计价格。您可以在此SQL fiddle中查看结果。 (数据类型显然是关闭的,这只是为了显示它的运行)

    修改 要使广告ID类似于room_type_ids:

    select advert_id, room_type_id, SUM(price) 
    from prices_adverts 
    where  (date >= "2013-09-20" AND date <"2013-09-21") 
       -- notice: no filtering for room_type_id or advert id this time
    group by advert_id, room_type_id
    order by price    
    

    这将有三列:advert_id,room_type_id和总计价格......

答案 2 :(得分:0)

您可以使用

sum(case when price is null then 0 else price end) 

sum(isnull(price,0))

just add in your where clause `price is not null` to exclude them.

答案 3 :(得分:0)

你需要使用HAVING

select SUM(price) 
from prices_adverts 
where advert_id="7" and room_type_id="54" and (date >= "2013-09-20" AND date <"2013-09-21")
having sum(price) is not null 
order by sum(price)