2015-11-22 22 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 | 
+----+------+------+ 

現在我想在這兩個col1col2進行搜索。事情是這樣的:

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(COL1,COL2)' –

+0

@GiorgosBetsos好TNX,只是你的解決方案比這更好? col1 IN(1,2)或col2 IN(1,2)'? – stack

+0

使用'EXPLAIN'來查看我推薦的謂詞是否使用了你的複合索引。如果不是,那麼我所建議的是無用的。 –

回答

2

你想這個,對嗎?

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

如果是這樣,轉ORUNION。 (這是一個常見的優化特技。)

(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) 

那些兩列將足矣的複合索引。

(Appologies - 這可能是最好的許多脫節意見摘要)

+0

OOC,你爲什麼不用'WHERE col1 IN(x)OR vol2 IN(x)'概念? –

+0

該構造中不會使用索引。 'UNION'雖然更加複雜,但可以優化每個SELECTs。 –

+0

OTOH,如果大多數列值是1或2,我的SQL也不會使用索引。這是因爲執行表掃描通常比使用不太選擇性的索引更快。在這種情況下,'OR'會更快。 –