Задавайте вопросы, мы ответим
Вы не зашли.
Подскажите, нет ли возможности в IN проверять по несколько полей?
Т.е.
WHERE (f1,f2) IN ( (v1,v2), (v3,v4), (v5,v6) ... )
Вместо
WHERE (f1 = v1 AND f2=v2) OR (f1 = v2 AND f2=v3) OR (f1 = v5 AND f2=v6) ...
Вроде по доке так нельзя, но может какой оператор подходящий вместо In есть? Верхняя запись, имхо, выглядит гораздо компактней
Неактивен
Работает:
Неактивен
Ёлки, надо было самому проверить.
А чего ж они в доке то про это ни слова не написали?
http://dev.mysql.com/doc/refman/5.1/en/ … unction_in
Неактивен
Правая рука не знает что делает левая. Надо баг документации им отправить.
Неактивен
Хм. не подскажете почему в моей ситуации не работают индесы?
Таблица такая:
CREATE TABLE `se2` ( `num` int(11) default NULL, `str` char(20) default NULL, `date` date default NULL, KEY `ix_num` (`str`,`num`,`date`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Записей примерно 4 млн, сочетание полей str+num+date практически уникально (~1% дублей)
Запрос
SELECT str,num FROM se2 WHERE str IN ('str1','str2','str3')
индекс использует.
Запрос
SELECT str,num FROM se2 WHERE (str,num) IN ('str1','num1')
тоже индекс использует.
А вот так:
SELECT str,num FROM se2 WHERE (str,num) IN (('str1','num1'),('str2','num2'),('str3','num3'))
не использует, хотя индекс "покрывающий". В чем может быть дело?
Explain выдает лаконично:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE se2 ALL 4406921 Using where
Пробовал FORCE INDEX - не помогает. В какую сторону копнуть?
Неактивен
Боюсь, что копать надо в сторону bugs.mysql.com
Если переписать без туплов - использует ведь?
Неактивен
Да, без туплов использует.
Может потому в доке и нет инфы про IN по нескольким столбцам до сих пор?
Неактивен
Не думаю. Это две независимые баги. Одна в документации, вторая - в оптимизаторе.
Неактивен
Кстати, про "туплы в IN" в доке сказано, но в другом разделе - http://dev.mysql.com/doc/refman/5.1/en/ … tions.html
In other words, for a subquery that returns rows of n-tuples, this is supported: (val_1, ..., val_n) IN (subquery)
И баг с индексами тоже известен еще с 2007 года, если я всё правильно понял - http://bugs.mysql.com/bug.php?id=31188
Неактивен
Ну, они его отнесли в feature request, а потому не обрабатывают. Похоже таки прийдется переписывать
без туплов запрос. Благо это не очень сложно.
Неактивен
Придется. А в 5.1/6.0 всё так же? Просто у меня 5.0 и нет возможности проверить, а то может пификсили втихую...
Неактивен
Версия 5.1.21-beta-community
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra 1, 'SIMPLE', 'se2', 'index', '', 'ix_num', '30', '', 3, 'Using where; Using index'
Однако.
Неактивен
Могу только предположить, что mysql просекает, что одно поле число и сравнивает его в кодировке по умолчанию, а второе поле - строка, и сравнивает его в кодировке клиента. Так как они не совпадают - возникает ошибка. Наверно если такой запрос сделать из родного клиента mysql - ошибки не будет, а вы наверно сделали его из под винды в каком-нибудь query browser с кодировкой по умолчанию cp1251. Ну это только предположение.
Первая ошибка тоже интересна
Кстати где нибудь есть справочник под кодам ошибок и нотайсов с их описанием?
Неактивен
Ошибка возникает и в линуксе в консольном клиенте в koi8r (версия 5.0.45). Вот лог:
Неактивен
rgbeast написал:
SELECT str,num FROM se2 WHERE (str,num) IN (('str1',1));
^^^^^^^^^
А так и вовсе нельзя, в доке про это прямо сказано:
You should never mix quoted and unquoted values in an IN list because the comparison rules for quoted values (such as strings) and unquoted values (such as numbers) differ. Mixing types may therefore lead to inconsistent results.
Неактивен
Меня смущает, что ошибка проявляется в запросе
Неактивен
Если поставить кавычки, ничего не меняется - та же ошибка.
В запросе
Неактивен
Странно, но у меня не воспроизводится. Специально проапгрейдил реплику до 5.1.30-community-log. Картина такая же как на пятерке, а таких ошибок как у вас - нету ни там, ни там. Сервер на Win Server 2003 R2.
Более того, даже если убрать кавычки с числа - тоже ошибок нет. Но у меня кодировка на сервере по умолчанию cp1251 у клиента тоже, наверно поэтому?
Неактивен
Если кодировка клиента и таблицы совпадает - ошибки нет. Попробуй создать таблицу в кодировке KOI8R.
Неактивен