[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли сократить такой запрос в MYSQL?
GET
Здравствуйте, можно ли сократить такого вида запрос:

$sss=mysql_query("SELECT COUNT(*) FROM `tab` WHERE `id`='".$n."' AND (`pole_11`='4' OR `pole_12`='4' OR `pole_13`='4' OR `pole_14`='4' OR `pole_15`='4') AND `b`=0");
вот эта часть:

(`pole_11`='4' OR `pole_12`='4' OR `pole_13`='4' OR `pole_14`='4' OR `pole_15`='4')


есть ли в MySQL способ записать короче и не так громоздко?
Что-то типа (pole_11,pole_12)=4?



Спустя 31 минута, 4 секунды (7.11.2011 - 08:25) alex12060 написал(а):

concat()
between()


Попробуй с ними поиграться

Спустя 1 минута, 12 секунд (7.11.2011 - 08:26) GET написал(а):
alex12060

спасибо...сейчас попробую

Спустя 12 минут, 46 секунд (7.11.2011 - 08:38) GET написал(а):
alex12060
наткнулся на IN...попробую переделать под него smile.gif, но неуверен, хотя BETWEEN тоже можно использовать спасибо!

Спустя 35 минут, 59 секунд (7.11.2011 - 09:14) sergeiss написал(а):
between - для непрерывного диапазона значений, а IN - для произвольного списка.

Спустя 4 минуты, 35 секунд (7.11.2011 - 09:19) GET написал(а):

все таки немного не то...вот если б интервал столбцов можно было задать

Спустя 8 минут, 39 секунд (7.11.2011 - 09:28) KonstantinK написал(а):
IN в данном случае не поможет, а чем запись с OR плоха то?

Спустя 20 минут, 45 секунд (7.11.2011 - 09:48) sergeiss написал(а):
Цитата (KonstantinK @ 7.11.2011 - 10:28)
IN в данном случае не поможет

Как это не поможет????????????????????? Очень даже поможет. Вместо длинного перечня с OR пишем IN (тут_список_допустимых_величин).
И какие проблемы ты тут видишь?

Спустя 12 минут, 33 секунды (7.11.2011 - 10:01) imbalance_hero написал(а):
sergeiss
Не величины ТС надо, а поля. 4 IN (`cell1`,`cell2`) , но врядли такое будет работать...

Спустя 23 минуты, 50 секунд (7.11.2011 - 10:25) GET написал(а):
imbalance_hero

Да...да

Спустя 1 минута, 4 секунды (7.11.2011 - 10:26) sergeiss написал(а):
Цитата (imbalance_hero @ 7.11.2011 - 11:01)
Не величины ТС надо, а поля. 4 IN (`cell1`,`cell2`) , но врядли такое будет работать...

Проверить надо в Мускуле.

А в Постгре работает, однозначно smile.gif Я думаю, что и в Мускуле должно работать.

И надо не ГАДАТЬ, а ПРОВЕРИТЬ!!!

Спустя 44 секунды (7.11.2011 - 10:27) GET написал(а):
KonstantinK
громоздкая запись...тем более она генерируется, лишние вычисления

sergeiss
сейчас проверю

Спустя 10 минут, 27 секунд (7.11.2011 - 10:37) GET написал(а):
нет не работает...и ошибку почему то не пишет в этом месте скрипт тупо перестает работать or die(mysql_error()); не помогает

Спустя 4 минуты, 25 секунд (7.11.2011 - 10:42) sergeiss написал(а):
Ты сам запрос-то покажи smile.gif Чай, не секретный? А то, может быть, там где-то ошибка в запрос.

Спустя 2 минуты, 38 секунд (7.11.2011 - 10:44) imbalance_hero написал(а):
A.B.C.
Всё работает как я показал. И тестировать запросы лучше напрямую с мускулом (либо PMA), а уже потом переносить в скрипты.
http://my.jetscreenshot.com/7950/20111107-unp3-29kb

Спустя 1 минута, 57 секунд (7.11.2011 - 10:46) GET написал(а):
$sss=mysql_query("SELECT COUNT(*) FROM `".mysql_real_escape_string($baza)."` WHERE `id`='".$n."'".$z." AND 13 IN (`pole_11`,`pole_12`,`pole_13`,`pole_14`,`pole_15`) AND (`passport`=1) LIMIT 1")or die(mysql_error());


sergeiss

ошибка действительно была...ошибку исправил, но вроде не робит все равно...ищу еще дальше

Спустя 3 минуты, 49 секунд (7.11.2011 - 10:50) imbalance_hero написал(а):
A.B.C.
Банально делаем дамп этой таблицы и одной записи(!), можно двух, которые отвечают условию. Я вставлю в PMA и покажу тебе smile.gif

Вообще mysql_query замени на exit(), получишь эту строку, каков у неё вид, тоже выстави тут.

Спустя 2 минуты, 39 секунд (7.11.2011 - 10:53) GET написал(а):
imbalance_hero

я так понимаю судя по запросу id (int), а date(date), запрос выбрать записи где id=2001-01-11 или date=2001-01-11 и это работает?

секунду
"Вообще mysql_query замени на exit()" не понял как это?

Спустя 7 минут, 2 секунды (7.11.2011 - 11:00) GET написал(а):
			$sss=mysql_query("SELECT COUNT(*) FROM `".mysql_real_escape_string($baz)."` WHERE 13 IN(`pole_11`,`pole_12`,`pole_13`,`pole_14`,`pole_15`) LIMIT 1")or exit(mysql_error());


выбирает все поля подряд как-будто WHERE нет!

Спустя 35 секунд (7.11.2011 - 11:00) GET написал(а):
может с COUNT(*) не работает?

Спустя 2 минуты, 10 секунд (7.11.2011 - 11:02) sergeiss написал(а):
Цитата (A.B.C. @ 7.11.2011 - 11:46)
$sss=mysql_query("SELECT COUNT(*) FROM `".mysql_real_escape_string($baza)."` WHERE `id`='".$n."'".$z." AND 13 IN (`pole_11`,`pole_12`,`pole_13`,`pole_14`,`pole_15`) AND (`passport`=1) LIMIT 1")or die(mysql_error());

Вообще, поиск ошибки в таком запросе - дело очень гиморное и в принципе не верное. Ты напиши запрос полностью без переменных и запусти его в PHPMyAdmin! Тогда ты будешь именно запрос тестировать. А то сейчас то ли запрос тестируешь, то ли ошибки ищешь в написании запроса. То ли переменные забыл назначить, используемые в запросе.

В самом простом варианте, если только ПХП используешь, то сначала запиши запрос в переменную, а если он ошибку дает, то выводи запрос на экран.
Типа такого:
$sql="SELECT COUNT(*) FROM `".mysql_real_escape_string($baza)."` WHERE `id`='".$n."'".$z." AND 13 IN (`pole_11`,`pole_12`,`pole_13`,`pole_14`,`pole_15`) AND (`passport`=1) LIMIT 1";
$sss=mysql_query( $sql );
if( !$sss )
echo $sql.'<br>';


Говорю об этом, потому что и у себя, и на форуме много раз такую проблему видел. Вроде ошибка есть, но запрос правильный. А оказывается, что данные в запрос неверные подставляются. Вот и надо проверить, что же там на самом деле было запрошено у БД.

PS. И кстати. "LIMIT 1" в данном запросе излишне :) Не ошибка, а просто излишне. Потому что COUNT выдаст ответ в виде одной строки и одного столбца. То есть, одно значение всего.

Спустя 7 минут, 28 секунд (7.11.2011 - 11:10) GET написал(а):
sergeiss

Точно!!!...в админе все правильно работает это у меня в скрипте глюк какой-то!\

Спустя 45 секунд (7.11.2011 - 11:11) GET написал(а):
sergeiss
imbalance_hero

Спасибо парни буду ошибку искать в скрипте что где теряется

Спустя 15 минут, 59 секунд (7.11.2011 - 11:27) GET написал(а):
Блин, в поисках бага я забыл что вытащил из запроса переменную и вставил простое число...все заробило еще раз спасибо!

Интересно, а это нормальное свойство мускула...ну не получится что через пару лет выйдет какой-нибудь апдейт и его прикроют...просто в офф документации сказано только про IN( val1,val2....valN), а не наоборот про столбцы IN(N1,N2...)

Спустя 15 минут, 48 секунд (7.11.2011 - 11:42) sergeiss написал(а):
Я вот только сейчас глянул в документации по Мускулю, что у меня есть:

11.2.8.3. Subqueries with ANY, IN, and SOME
Syntax:

operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)

....

When used with a subquery, the word IN is an alias for = ANY. Thus, these two statements are the same:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);


Так что не только IN( val1,val2....valN) есть в документации :) Надо просто уметь её читать внимательно.

Спустя 3 минуты, 54 секунды (7.11.2011 - 11:46) GET написал(а):
sergeiss
+++!!! smile.gif

Спустя 4 часа, 11 минут, 8 секунд (7.11.2011 - 15:57) GET написал(а):
Хочу приподнять тему т.к. задался таким вопросом использования IN
как работает часть запроса: "12 IN (`pole1`,`pole2`,`pole3`,`pole4`,`pole5`)" т.е. не игнорируются ли индексы полей (в проиндексированной таблице!) `pole1`,`pole2`,`pole3`,`pole4`,`pole5`? Не заставляет ли IN делать как бы горизонтальную трассировку читая строчки, а не столбцы.

Т.е. если запрос будет в виде: "(`pole1`=12 OR `pole2`=12 OR `pole3`=12 OR `pole4`=12 OR `pole5`=12)" то мускул сразу смотрит в своем отсортированном индексе есть ли позиция 12 и так же с другими полями т.е. идет вертикальная трасировка?

Надеюсь я доступно объяснил. Хотя, как я понял IN и OR...OR эквивалентны

Спустя 16 минут, 35 секунд (7.11.2011 - 16:14) sergeiss написал(а):
Почитай про EXPLAIN в Мускуле и юзай эту штуковину.

Спустя 5 минут, 34 секунды (7.11.2011 - 16:20) GET написал(а):
sergeiss

Ок...давно думаю поюзать это.


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.