2013-07-23 41 views
0

我有我的表結構是這樣的:如何做到這一點的MySQL查詢在哪裏我想並排查詢列?

col1 col2 col3 
1 1 1 
1 2 1 
1 3 1 
2 10 1 

現在我在蟒蛇(1,2)元組的第1列和(1,1)列3

這樣的信息我想查詢表,使得在SELECT子句中我想用第3列。

對應列值爲1,我的意思

將有兩個疑問:

Select * from table where col1 = 1 and col3 = 1; 
Select * from table where col1 = 2 and col3 = 1; 

我想結合這些,併爲我的元組中的條目做到這一點。 我可以做很多ands和union,但這不是超過10個值的好解決方案。

+0

爲什麼不在python for循環? – AliBZ

回答

0

你的最簡單的方法,那是不太可能導致性能問題,會在整個元組進行迭代,併產生每個AND條件,用括號括起來,並通過OR條件加盟,從而生成查詢:

SELECT * 
FROM table 
WHERE (col1 = 1 AND col3 = 1) 
    OR (col1 = 2 AND col3 = 1) 
    OR (...) 

不錯,但是,這可能不會特別好。您可能首先分析您在WHERE子句中使用的值的元組,以便生成稍微更緊湊的條件,對於每個唯一可接受的col1值,OR將所有可接受的col3值組合在一起,然後將它們與col1進行AND運算值。例如,考慮的元組(1, 1)(1, 2)(2, 1)(2, 3),並從中產生以下查詢:

SELECT * 
FROM table 
WHERE (col1 = 1 AND (col3 = 1 OR col3 = 2)) 
    OR (col1 = 2 AND (col3 = 1 OR col3 = 3)) 

這是一個有點比第一種方法的結果不太凌亂,並且需要更多公平一點努力進取的時間,但它可能會執行得更快,因爲AND short-circuiting意味着數據庫引擎可以更快速地確定給定的行是否滿足WHERE子句;不需要單獨檢查每個行的每個(col1 = @m AND col2 = @n)條件,它可以簡單地檢查行的col1值是否匹配,如果不匹配,則忽略其餘條件。 (當然,MySQL的查詢優化器應該已經爲你做了這件事,雖然它需要徹底的基準測試才能確定,但​​鑑於優化的顯而易見性,我非常強烈地懷疑你是免費的。儘管如此,查詢的第二種形式仍然更具人性化,但這對您而言可能並不重要)。

無論如何,如果您需要跨越可接受值的許多元​​組來做到這一點,那麼您將成爲生成一個相對複雜的查詢,或者一羣頭腦簡單的查詢;每種方法都有好處和缺點,但考慮到您的要求和您的輸入,我傾向於懷疑您會找到一種算法,該算法生成的查詢明顯更緊湊,並且仍然可讀,足以在調試失敗時進行調試。

如果您關心性能,我建議您等待,直到您證明存在性能問題爲止。如果您已經完成了該操作,請檢查您正在查詢的表格上的索引;如果您尚未在WHERE條件中使用的列創建索引,那麼現在將是一個很好的時機。