2013-08-09 1 views
1

У меня есть столбец с именем post_typeset('0', '1', '2', '3', '4'), который может быть любой комбинацией от 0 до 4MySQL Выберите любой SET, используя IN()?

Учитывая список целых чисел, как я могу выбрать любую строку, соответствующую любой из типов? Мой мозг выпученными, и я даже не могу объяснить правильно, но похоже на:

SELECT * FROM `post_content` WHERE `post_type` IN ('0','1','2'); 

Так со следующим набором он будет соответствовать все записи, за исключением последних один

post_type 
0,1,3 (matches 0 and 1) 
0,3,4 (matches 0) 
0,4 (matches 0) 
2,3,4 (matches 2) 
3,4 (not matched) 

Большое спасибо

Edit: Я понимаю FIND_IN_SET, но я стараюсь избегать:

SELECT * FROM tbl_name WHERE 
FIND_IN_SET(0,post_type)>0 || 
FIND_IN_SET(1,post_type)>0 || 
FIND_IN_SET(2,post_type)>0 
+0

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set? но это только для одиночных значений. Вы пытаетесь найти кратность, что означает, что вам, вероятно, будет лучше нормализовать настройку в подкатегорию, а затем вы можете сделать регулярное соединение. –

+0

Я пытаюсь сопоставить любое из нескольких значений. Не одиночные значения. –

+0

У меня нет контроля над базой данных, просто доступ к запросам тоже. :( –

ответ

1

В соответствии с MySQL reference manual:

«MySQL хранит значения SET численно, причем младший бит сохраненного значения соответствует первому набору элементов. Если вы извлекаете значение SET в числовом контексте, то значение, извлеченное имеет биты набор соответствующих элементов множества, которые составляют значение столбца «

Таким образом, вы можете использовать bit operations выполнять множество арифметических операций:. & соответствует setset, а | соответствует соединению

Единственная проблема заключается в том, что вам нужно будет вычислить любые постоянные битмаски, которые могут возникнуть в ваших запросах, на основе определения столбца, насколько мне известно, MySQL не предоставляет никаких удобный синтаксис для преобразования строкового представления значения столбца SET в соответствующую числовую битовую маску, за исключением назначения его этому столбцу.

Например, в вашем примере выше, набор 0,1,2 будет соответствовать битовую 1 + 2 + 4 = 7. Таким образом, вы эффективно можете получить все строки, содержащие одно из этих значений в наборе с запросом:

SELECT * FROM post_content WHERE post_type & (1 + 2 + 4); 

Вот демо этого запроса: http://sqlize.com/wE4je6f28Y

1

Обычно вы поиск значений SET с помощью функции FIND_IN_SET() или LIKE оператор:

mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; 
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; 

Источник: http://dev.mysql.com/doc/refman/5.0/en/set.html


Таким образом, в вашем примере, это было бы:

SELECT * FROM post_content 
WHERE FIND_IN_SET(0,post_type)>0 
OR FIND_IN_SET(1,post_type)>0 
OR FIND_IN_SET(2,post_type)>0 
+0

Думаю, мне придется укусить пулю на этом. Я просто подумал, что будет более простой способ. –

+0

Извините ... Отредактировано. –