2015-11-22 2 views
2

Вот мой стол:Как искать в нескольких столбцах?

// table 
+----+------+------+ 
| id | col1 | col2 | 
+----+------+------+ 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 1 | 3 | 
| 4 | 2 | 1 | 
| 5 | 2 | 2 | 
| 6 | 3 | 1 | 
| 7 | 3 | 2 | 
| 8 | 3 | 3 | 
| 9 | 3 | 4 | 
| 10 | 3 | 5 | 
+----+------+------+ 

Теперь я хочу, чтобы искать в обоих col1 и col2. Что-то вроде этого:

select * from table where col1,col2 IN (1,2); 

И я хочу это выхода:

+----+------+------+ 
| id | col1 | col2 | 
+----+------+------+ 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 1 | 3 | 
| 4 | 2 | 1 | 
| 5 | 2 | 2 | 
| 6 | 3 | 1 | 
| 7 | 3 | 2 | 
+----+------+------+ 

Ну, моя проблема заключается в этой части: ... where col1,col2 IN (1,2). Как я могу это решить?

Примечание: Я могу сделать это вот так: ... where col1 IN (1,2) or ,col2 IN (1,2). Но это так, я должен создать два отдельных индекса для каждого столбца. В то время как мне нужен запрос, который необходим для индекса группы следующим образом: KEY NameIndex (col1, col2)

+0

Попробуйте 'WHERE 1 IN (col1, col2) ИЛИ 2 IN (col1, col2)' –

+0

@GiorgosBetsos Ok Тпх, просто ваше решение лучше, чем это? 'где col1 IN (1,2) или, col2 IN (1,2)'? – stack

+0

Используйте 'EXPLAIN', чтобы узнать, рекомендуют ли предикаты использовать ваш составной индекс. Если нет, то то, что я предлагаю, бесполезно. –

ответ

2

Вы хотите это, правильно?

WHERE col1 IN (1,2) 
    OR col2 IN (1,2) 

Если да, то включите OR в UNION. (Это обычная оптимизация трюк.)

(SELECT ... WHERE col1 IN (1,2)) 
UNION DISTINCT -- since there are likely to be dups 
(SELECT ... WHERE col2 IN (1,2)); 

и обеспечить оптимальный индекс для каждого SELECT:

INDEX(col1), 
INDEX(col2) 

Составной индекс этих двух столбцов будет не достаточно.

(-. Извинения, это, вероятно, резюме лучших из многих разрозненных комментариев)

+0

OOC, почему бы вам просто не пойти с концепцией WHERE col1 IN (x) ИЛИ vol2 IN (x)? –

+0

В этой конструкции индекс не будет использоваться. «UNION», хотя и беспорядочный, может оптимизировать каждый из «SELECTs». –

+0

OTOH, если большинство значений столбцов 1 или 2, мой SQL также не будет использовать индексы. Это происходит потому, что быстрее выполнять сканирование таблицы быстрее, чем использовать не-избирательный индекс. В этом случае «OR» будет быстрее. –

Смежные вопросы