Mysql возвращает null для несуществующих строк

У меня такой код:

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 за пределами while? Как? Пожалуйста, помогите спасибо

Могу я объяснить, что именно мне нужно, это может помочь мне в этом :) Выше я просматриваю номера в отелях, чтобы проверить, сколько будет стоить номер на определенный период. Затем мне нужно нарисовать кнопку вне цикла, которая будет перенаправлять посетителя на страницу бронирования. Но если в отеле нет доступных цен на номера на определенные даты, я хочу, чтобы у меня не было кнопки для бронирования. Вот почему мне нужно выяснить, есть ли в отеле хотя бы 1 номер с ценами или нет .. Надеюсь, это поможет

########################################################Update

первый запрос: я беру все идентификаторы лондонских отелей

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 и о том, что это уже добавленная треска. Что бы вы посоветовали?


person thecore7    schedule 19.09.2013    source источник
comment
Что это за язык программирования?   -  person Oswald    schedule 19.09.2013


Ответы (4)


Может, добавив AND price IS NOT NULL?

person Michael Laffargue    schedule 19.09.2013
comment
php, и я попробовал это И цена НЕ НУЛЯ, но по-прежнему возвращает строку с НУЛЕВЫМ значением для записей, которые не существуют. - person thecore7; 19.09.2013

Решением неотложной проблемы может быть следующий запрос:

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. для каждой итерации выполнить запрос

Это плохо. Базы данных очень хорошо справляются с решением подобных проблем, используя JOINs и другие подходящие предложения. Я бы посоветовал использовать эти функции и перевернуть все в своей голове. Таким образом, вы можете выполнить один запрос, возвращающий все необходимые вам данные. Я считаю, что это может быть таким запросом, предоставляющим все идентификаторы типов комнат с их суммированными ценами:

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. (типы данных явно отключены, это просто для демонстрации работы)

РЕДАКТИРОВАТЬ Чтобы рекламные идентификаторы тоже были похожи на 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 и суммарная цена ...

person ppeterka    schedule 19.09.2013
comment
Ппетерка 66, спасибо, что помогли мне. Я проверил ваш запрос, и когда я повторяю $ num_rows, я получаю 1 и 0 для обоих запросов .. И еще кое-что, это while потому, что я зацикливаю Advert_id-s, а не только room_type_id .. Advert_id также является переменной, переданной из предыдущего запроса - person thecore7; 19.09.2013
comment
вот как это выглядит: $ que = 'выберите СУММ (цену) из price_adverts, где Advert_id ='. $ id. ' и room_type_id = '. $ row [' 6 '].' и (date ›= '. $ checkinDate.' AND date‹ '. $ checkoutDate.'), имеющий сумму (цена), не является нулевым порядком по сумме (цене) '; - person thecore7; 19.09.2013
comment
@ thecore7 Я думаю, вам следует вставить больший фрагмент кода, включая предыдущий запрос, чтобы предоставить хорошее решение. Тем временем я обновил свой ответ, чтобы иметь версию, в которой также есть Advert_id в группе. - person ppeterka; 19.09.2013
comment
Ppeterka 66, то, что вы посоветуете, поворачивает логику выбора Advert_id. В предыдущем запросе я нахожу все adverts_id-ы для тех отелей, которые расположены в Лондоне, например, и room_type_id для комнаты, в которой могут разместиться 3 посетителя .. Вот почему в приведенном выше запросе у меня есть все правильные идентификаторы отелей и правильный идентификатор комнаты. s и теперь я проверяю цены на каждую комнату .. но в некоторых комнатах нет цен .. вы понимаете, почему я не могу изменить логику / запрос? - person thecore7; 19.09.2013
comment
Не существует такой вещи, как неизменный код. Особенно в этом случае. Я все же рекомендую вам опубликовать код еще на один уровень, чтобы увидеть внешний цикл zou do, с querz zou do для получения этих данных. Я уверен, что есть лучший способ решить то, что вы хотите, сделав шаг назад и взглянув на проблему в целом, а не на проблему, сразу же блокирующую вас ... - person ppeterka; 19.09.2013
comment
Пожалуйста, посмотрите мою правку Ppeterka 66, я не добавлял html, чтобы не тратить место :) - person thecore7; 19.09.2013

Вы могли бы использовать

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

or

sum(isnull(price,0))

or

just add in your where clause `price is not null` to exclude them.
person MrSimpleMind    schedule 19.09.2013
comment
price is not null будет работать, если цена вообще есть, но когда такая запись не существует, она возвращает NULL - person thecore7; 19.09.2013

Вам нужно использовать 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)
person AdrianBR    schedule 19.09.2013
comment
Адриан, твое предложение близко к тому, что мне нужно. $ num_rows вернул 1 0 для каждого запроса, но как я могу сказать, что вне этого времени if ($ num_rows ›0) {echo '‹ input type .. ›';} - person thecore7; 19.09.2013
comment
if (empty ($ results)) {echo 'Результаты не найдены'; } else {повторить ваш результат} - person AdrianBR; 19.09.2013
comment
снаружи, пока он дает мне num_rows только последнего запроса, поэтому это не подходит для моей цели, если вы читаете мое редактирование - person thecore7; 19.09.2013
comment
Могу ли я просуммировать Num_rows по всем запросам и если ›0 нарисовать кнопку? будет ли это видно снаружи, пока эта сумма num_row? - person thecore7; 19.09.2013
comment
у вас может быть один запрос. Просто используйте where room_type_id в (55,56,57 и т. Д.) - person AdrianBR; 19.09.2013
comment
не могу вам сильно помочь с php - person AdrianBR; 19.09.2013