$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...попробую переделать под него , но неуверен, хотя BETWEEN тоже можно использовать спасибо!
наткнулся на IN...попробую переделать под него , но неуверен, хотя 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`) , но врядли такое будет работать...
Не величины ТС надо, а поля. 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`) , но врядли такое будет работать... |
Проверить надо в Мускуле.
А в Постгре работает, однозначно Я думаю, что и в Мускуле должно работать.
И надо не ГАДАТЬ, а ПРОВЕРИТЬ!!!
Спустя 44 секунды (7.11.2011 - 10:27) GET написал(а):
KonstantinK
громоздкая запись...тем более она генерируется, лишние вычисления
sergeiss
сейчас проверю
громоздкая запись...тем более она генерируется, лишние вычисления
sergeiss
сейчас проверю
Спустя 10 минут, 27 секунд (7.11.2011 - 10:37) GET написал(а):
нет не работает...и ошибку почему то не пишет в этом месте скрипт тупо перестает работать or die(mysql_error()); не помогает
Спустя 4 минуты, 25 секунд (7.11.2011 - 10:42) sergeiss написал(а):
Ты сам запрос-то покажи Чай, не секретный? А то, может быть, там где-то ошибка в запрос.
Спустя 2 минуты, 38 секунд (7.11.2011 - 10:44) imbalance_hero написал(а):
A.B.C.
Всё работает как я показал. И тестировать запросы лучше напрямую с мускулом (либо PMA), а уже потом переносить в скрипты.
http://my.jetscreenshot.com/7950/20111107-unp3-29kb
Всё работает как я показал. И тестировать запросы лучше напрямую с мускулом (либо 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 и покажу тебе
Вообще mysql_query замени на exit(), получишь эту строку, каков у неё вид, тоже выстави тут.
Банально делаем дамп этой таблицы и одной записи(!), можно двух, которые отвечают условию. Я вставлю в PMA и покажу тебе
Вообще 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()" не понял как это?
я так понимаю судя по запросу 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
Спасибо парни буду ошибку искать в скрипте что где теряется
imbalance_hero
Спасибо парни буду ошибку искать в скрипте что где теряется
Спустя 15 минут, 59 секунд (7.11.2011 - 11:27) GET написал(а):
Блин, в поисках бага я забыл что вытащил из запроса переменную и вставил простое число...все заробило еще раз спасибо!
Интересно, а это нормальное свойство мускула...ну не получится что через пару лет выйдет какой-нибудь апдейт и его прикроют...просто в офф документации сказано только про IN( val1,val2....valN), а не наоборот про столбцы IN(N1,N2...)
Интересно, а это нормальное свойство мускула...ну не получится что через пару лет выйдет какой-нибудь апдейт и его прикроют...просто в офф документации сказано только про IN( val1,val2....valN), а не наоборот про столбцы IN(N1,N2...)
Спустя 15 минут, 48 секунд (7.11.2011 - 11:42) sergeiss написал(а):
Я вот только сейчас глянул в документации по Мускулю, что у меня есть:
Так что не только IN( val1,val2....valN) есть в документации :) Надо просто уметь её читать внимательно.
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
+++!!!
+++!!!
Спустя 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 эквивалентны
как работает часть запроса: "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
Ок...давно думаю поюзать это.
Ок...давно думаю поюзать это.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.