Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрос с WHERE

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: В запросе сделать проверку
pantela
Отправлено: 22 Августа, 2010 - 20:27:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Есть таблица с объявлениями:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `jos_as_ads_stan` (
  2.   `id` int(4) NOT NULL AUTO_INCREMENT,
  3.   `publish` int(1) DEFAULT '0',
  4.   `date_start` date DEFAULT '0000-00-00',
  5.   `date_end_vip` date DEFAULT '0000-00-00',
  6.   `date_end_std` date DEFAULT '0000-00-00',
  7.   PRIMARY KEY  (`id`),
  8.   KEY `id` (`id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5;
  10.  
  11. INSERT INTO `jos_as_ads_stan` VALUES (1, 1, '2010-07-19', '2010-07-19', '2010-11-19');
  12. INSERT INTO `jos_as_ads_stan` VALUES (2, 1, '2010-07-19', '2010-11-19', '2010-07-19');
  13. INSERT INTO `jos_as_ads_stan` VALUES (3, 1, '2010-07-19', '2010-07-19', '2010-11-19');
  14. INSERT INTO `jos_as_ads_stan` VALUES (4, 1, '2010-07-19', '2010-11-19', '2010-07-19');
  15. INSERT INTO `jos_as_ads_stan` VALUES (5, 1, '2010-07-19', '2010-07-19', '2010-11-19');
  16. INSERT INTO `jos_as_ads_stan` VALUES (6, 1, '2010-07-19', '2010-07-19', '2010-11-19');
  17. INSERT INTO `jos_as_ads_stan` VALUES (7, 1, '2010-07-19', '2010-07-19', '2010-11-19');
  18.  


Агоритм вывода токой:
Выводить 2 вида объявдения где:
I)
1. publish=1
2. date_end_vip большое текушей даты
PHP:
скопировать код в буфер обмена
  1. "WHERE publish = 1 AND DATE(date_end_vip) >= CURRENT_DATE()";


II)
1. publish=1
2. date_end_std большое текушей даты
PHP:
скопировать код в буфер обмена
  1. "WHERE publish = 1 AND DATE(date_end_std) >= CURRENT_DATE()";


По частям всё работает,

Вот только мне надо что бы эти оба запросы работали через 1 запрос:
Попробовал запрос, но ничего не выводится:
PHP:
скопировать код в буфер обмена
  1. "WHERE publish = 1 AND (DATE(date_end_vip) >= CURRENT_DATE()) AND (DATE(date_end_std) >= CURRENT_DATE())";


т.е. надо разделить что бы оба вида учитывались бы. У меня зяпрос работает через функцию, поэтому через 1 зарос надо
 
 Top
Champion Супермодератор
Отправлено: 22 Августа, 2010 - 20:32:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Объединение - это OR:
CODE (SQL):
скопировать код в буфер обмена
  1. HERE publish = 1 AND ( (DATE(date_end_vip) >= CURRENT_DATE()) OR (DATE(date_end_std) >= CURRENT_DATE()))
 
 Top
Uchkuma
Отправлено: 22 Августа, 2010 - 20:35:28
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Видимо вы так хотели:
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE publish = 1 AND (DATE(date_end_vip) >= CURRENT_DATE() OR DATE(date_end_vip) >= CURRENT_DATE())
pantela, пожалуйста, для запросов sql используйте sql-подсветку.
(Добавление)
Чемп! ;)

pantela, типичная ошибка новичка. AND - это не объединение выборки, а объединение условия выборки.
(Добавление)
pantela, Champion, также советую не использовать в запросе лишних скобочек без надобности.

(Отредактировано автором: 22 Августа, 2010 - 20:42:37)

 
 Top
pantela
Отправлено: 22 Августа, 2010 - 20:52:07
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Uchkuma - случайно не сделал подсветку ))

Немного не понял вас. как сделать. вот полная функция запроса:
То что мне надо с 11 по 14 строку.

CODE (SQL):
скопировать код в буфер обмена
  1. FUNCTION search($tip_nejvijimosti, $tip_sdelki, $region, $raion, $cena_min, $cena_max, $limit=0, $limitstart=0) {
  2.                 $db = &JFactory::getDBO();
  3.                
  4.                 $tip_nejvijimosti = (int) $tip_nejvijimosti;
  5.                 $tip_sdelki = (int) $tip_sdelki;
  6.                 $region = (int) $region;
  7.                 $raion = (int) $raion;
  8.                 $cena_min = (int) $cena_min;
  9.                 $cena_max = (int) $cena_max;
  10.                
  11.                 $query = "SELECT * "
  12.                                                 ."FROM #__as_ads_stan "
  13.                                                 ."WHERE publish = 1 "
  14.                                                 ."AND (DATE(date_end_vip) >= CURRENT_DATE()) or (DATE(date_end_std) >= CURRENT_DATE()) ";
  15.                 IF ($tip_nejvijimosti)
  16.                         $query .= "AND tip_nejvijimosti=$tip_nejvijimosti ";
  17.                 IF ($tip_sdelki)
  18.                         $query .= "AND tip_sdelki=$tip_sdelki ";
  19.                 IF ($region)
  20.                         $query .= "AND region=$region ";
  21.                 IF ($raion)
  22.                         $query .= "AND raion=$raion ";
  23.                 IF ($cena_min && !$cena_max)
  24.                         $query .= "AND (cena >= $cena_min OR cena IS NULL OR cena = 0) ";
  25.                 IF ($cena_max && !$cena_min)
  26.                         $query .= "AND (cena <= $cena_max OR cena IS NULL OR cena = 0) ";
  27.                 IF ($cena_min && $cena_max)
  28.                         $query .= "AND (cena >= $cena_min AND cena <= $cena_max OR (cena IS NULL OR cena = 0)) ";
  29.                 IF (!$cena_min && !$cena_max)
  30.                         $query .= "AND (cena IS NOT NULL OR cena IS NULL OR cena = 0) ";
  31.                 $query .= "ORDER BY id DESC ";
  32.                 IF ($limit)
  33.                         $query .= "LIMIT $limitstart, $limit";
  34.                 $db->setQuery($query);
  35.                 $searchResult = $db->loadObjectList();
  36.                
  37.                 RETURN $searchResult;
  38.         }
 
 Top
alexspb
Отправлено: 22 Августа, 2010 - 20:57:45
Post Id


Посетитель


Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010  


Помог: 0 раз(а)





лучше не использовать такие функции - не будет кэширования

лучше " . date('Y-m-d') . "


-----
Хостинг - неограниченно доменов на одну папку
Ajax - отличное введение
 
 Top
Champion Супермодератор
Отправлено: 22 Августа, 2010 - 21:01:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Uchkuma пишет:
Champion, также советую не использовать в запросе лишних скобочек без надобности
Я просто скопировал запрос автора, оставил в нём авторские скобки и добавил снаружи свои)
Да и нет ничего страшного в них.
 
 Top
Uchkuma
Отправлено: 22 Августа, 2010 - 21:16:15
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




pantela пишет:
Немного не понял вас. как сделать. вот полная функция запроса:
И что? Не работает?
Champion пишет:
Я просто скопировал запрос автора, оставил в нём авторские скобки и добавил снаружи свои)
Да и нет ничего страшного в них.
Это скорее относится к вопросу оптимизации. Страшного может и ничего, но и смысла тоже никакого. Скобки в данном случае используют для объединения каких-либо условий, а заключение в скобки одного условия - по моему бред.
 
 Top
pantela
Отправлено: 22 Августа, 2010 - 23:37:15
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Ну вот именно это часть не работает как надо:
т.е. 2 мне надо вывести объявления 2 вида через это 1 запрос

CODE (SQL):
скопировать код в буфер обмена
  1. $query = "SELECT * "
  2.                               ."FROM #__as_ads_stan "
  3.                               ."WHERE publish = 1 "
  4.                               ."AND (DATE(date_end_vip) >= CURRENT_DATE()) or (DATE(date_end_std) >= CURRENT_DATE()) ";


1. publish=1
2. date_end_vip большое текушей даты
CODE (SQL):
скопировать код в буфер обмена
  1. "WHERE publish = 1 AND DATE(date_end_vip) >= CURRENT_DATE()";


1. publish=1
2. date_end_std большое текушей даты
CODE (SQL):
скопировать код в буфер обмена
  1. "WHERE publish = 1 AND DATE(date_end_std) >= CURRENT_DATE()";


Вот и не понял как их обединить по моей функции OR или AND или что там ещё и как не понял Недовольство, огорчение
 
 Top
JustUserR
Отправлено: 23 Августа, 2010 - 14:31:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




pantela пишет:
Вот и не понял как их обединить по моей функции OR или AND или что там ещё и как не понял
Если вам требуется объединить несколько логических условий определяющих вывод SQL-запроса по различным критериям - можно использовать обычный оператор OR в предварительным вынесением за скобку
Кроме того для оптимизации условий как правило можно использовать свойства операторов короткого замыкания - в частности аргументы в AND и OR устанавливаются в таком порядке чтобы расчет каждого из них происходил в порядке возрастания ресурсоемкости - именно по этой причине не всегда для логических выражений имеет смысл проводить предварительную склейку или поглощение


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
pantela
Отправлено: 23 Августа, 2010 - 17:18:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Я очень рад что так теоритический обясняите, но вот не смог ли бы вы мне код прямо предостаивть запроса... Недовольство, огорчение

2 вида мне надо выводить. через 1 запрос. А OR вроде он тут будет как одно или второе, а AND как одно и второе.

но что то не так вроде, или я не праивльно понимаю...
 
 Top
Uchkuma
Отправлено: 23 Августа, 2010 - 17:36:10
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




pantela! Я и Champion вам все объяснили с примерами. Перечитайте выше и, пожалуйста, будьте внимательней.
CODE (SQL):
скопировать код в буфер обмена
  1. -- ваше условие
  2. WHERE publish = 1 AND (DATE(date_end_vip) >= CURRENT_DATE()) OR (DATE(date_end_std) >= CURRENT_DATE())
  3. -- мой пример
  4. WHERE publish = 1 AND (DATE(date_end_vip) >= CURRENT_DATE() OR DATE(date_end_std) >= CURRENT_DATE())
Разницу видите?
(Добавление)
И что эта тема делает в разделе php? А ну кыш в "Базы данных"!

(Отредактировано автором: 23 Августа, 2010 - 17:40:20)

 
 Top
JustUserR
Отправлено: 24 Августа, 2010 - 15:13:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




pantela пишет:
Я очень рад что так теоритический обясняите, но вот не смог ли бы вы мне код прямо предостаивть запроса
Для проверки правильности составления логического выражения вы можете использовать схему с избыточными скобками и операндами - в часности вы создаете отдельные группы условий и заключаете их в круглые скобки и объединяете их требуемой логической связкой - и после того как выражение станет работать необходимым образом можно осуществить раскрытие скобок и расстановку оперантов в порядке для операции короткого замыкания


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB