你的最簡單的方法,那是不太可能導致性能問題,會在整個元組進行迭代,併產生每個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條件中使用的列創建索引,那麼現在將是一個很好的時機。
爲什麼不在python for循環? – AliBZ