Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> грамотная запись в WHERE в выборке SELECT, Не могу грамотно заполнить WHERE
yogeswar  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 2
Пользователь №: 42563
На форуме: 9 месяцев, 14 дней
Карма:




У меня имеется таблица catalog1 в базе, вот её фрагменты (вверху названия столбцов):
country city predmet1 predmet1 on_dolgen mi_dolgni
Саратовская Урюпинск кирпич шпала 120 100
Пермская Касапетовка лопат грабли 200 100
Московская Урюкинск мотыга рогатка 100 400
-------------------------------- - и т. д. -------------------------------- ------------------------------
У меня есть массив предметов $wot1 = array(1=>ковшик, 2=>кастрюля,3=>кувшин,4=>меч).
Для дальнейшей обработки в SELECT я делаю строку:
$w1 = "'" . implode("', '",$wot1) . "'";



В результате этого получаем строку: 'ковшик', 'кастрюля', 'кувшин', 'меч'

У меня есть массив регионов $wot2 = array(1=>Московская, Нарофоминск, 2=>Челябинская,Курган).
$w2 = "'" . implode("', '",$wot2) . "'";



В результате получаем строку: 'Московская, Нарофоминск', 'Челябинская, Курган'

Теперь мне в команде SELECT надо сделать выбоку из таблицы catalog1:
$dydy = array();
$sql2 = "SELECT *
FROM catalog1 WHERE country IN (
$w2) and city IN ($w2) and
predmet1 IN (
$w1) or predmet2
IN (
$w1) and on_dolgen - mi_dolgni <= 30 or mi_dolgni — on_dolgen >= 0";
$result2 = mysql_query($sql2) or die(mysql_error());
while($row2 = mysql_fetch_array($result2, MYSQL_NUM)){
$dydy[] = $row2;
}


В этой записи нормально проходит predmet1 IN ($w1) or predmet2 IN ($w1).
Не проходит country IN ($w2) and city IN ($w2) , даже если запишу country, city IN ($w2).
Не проходит on_dolgen - mi_dolgni <= 30 or mi_dolgni - on_dolgen >= 0 (Прошло бы, если бы была простая запись: on_dolgen > 40, но это мне не нужно.
Вопрос.
Как мне грамотно сделать выборку в SELECT с учётом всех «пожеланий» в WHERE?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14974
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 1 день
Карма: 443




Сильно глубоко не вникал, но самое главное, что у тебя в условии есть И и ИЛИ. При таком указании, как у тебя, используются дефолтные приоритеты.
WHERE ... and ... and ... or ... and ... or ...

Сгруппируй их скобками так, чтобы логика была четкая и однозначная. Какой из вариантов твой? И не факт, что он тут есть :) Комбинаций может быть много разных.
WHERE (... and ... and ...) or (... and (... or ...))

WHERE (... and ...) and ( (... or ...) and (... or ...) )

WHERE ... and ( (... and (... or ...)) and (...or ...) )


Это сообщение отредактировал sergeiss - 22.02.2016 - 11:14


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 10 дней
Карма: 170




Вообще неправильная структура запроса.
Должно быть не
Цитата (yogeswar @ 22.02.2016 - 08:13)
В результате получаем строку: 'Московская, Нарофоминск', 'Челябинская, Курган'
....
FROM catalog1 WHERE country IN ($w2) and city IN ($w2) and ...


а
FROM catalog1 WHERE ( (country = '....' and city = '....') or   (country = '....' and city = '....')  .... ) and ( (predmet1 IN ($w1) or predmet2  IN ($w1) .... )  and (.... условия по долгам .... )


Собери часть условия WHERE для country и city в цикле в переменную, а потом ее подставь в запрос.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5493
Пользователь №: 35718
На форуме: 4 года, 17 дней
Карма: 167




Цитата (AllesKlar @ 22.02.2016 - 10:29)
Вообще неправильная структура запроса.

не факт что там структура БД правильная


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
yogeswar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 2
Пользователь №: 42563
На форуме: 9 месяцев, 14 дней
Карма:




Спасибо sergeiss , AllesKlar и Valick за ответы. Первый раз на этом сайте. Подскажите, только, когда я составил вопрос, то я не нашел кнопки "отправить". Просто выключил компьютер и ушел по делам. Может есть такая кнопка "отправить", когда появится новая тема?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 10 дней
Карма: 170




Цитата (yogeswar @ 22.02.2016 - 15:44)
Просто выключил компьютер и ушел по делам

Да, нормально, можно и так.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса