0

我有以下代码:

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'];    
}    

这将返回一些记录的总和,这些记录在数据库中有价格,对于不存在的记录返回 $price 为 NULL/当房间没有特定日期的价格时,它在表中不存在/所以我的问题是如何获得结果对于只存在的记录???我不需要价格的 NULL 值,是否可以在外部访问 $price while ?如何?请帮忙,谢谢

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

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

第一个查询:我要取所有伦敦酒店的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 的信息,并且它已经添加了 cod。你有什么建议?

4

4 回答 4

1

也许通过添加AND price IS NOT NULL

于 2013-09-19T12:36:25.013 回答
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. 从数据库查询行(room_type_ids)
  2. 把它们放在一个循环中
  3. 对于每次迭代运行一个查询

这是不好的。数据库非常擅长使用 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,而不列出那些没有的,并且在每个不同的 type_id 旁边,它都有总价格。您可以在这个SQL fiddle中看到结果。(数据类型显然是关闭的,这只是为了在操作中显示它)

编辑 要拥有类似于 room_type_ids 的广告 ID:

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 和总价...

于 2013-09-19T13:06:55.927 回答
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.
于 2013-09-19T12:39:45.073 回答
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)
于 2013-09-19T12:40:10.227 回答