2017-08-10 92 views
0

我目前使用MySQL Connector/Python來查詢數據庫。MySQL使用一條語句執行多個類似的select查詢

目前,我在做的過程中的一個看起來是這樣的:

SELECT some_column FROM some_table WHERE some_column_2 = foo_1; 
SELECT some_column FROM some_table WHERE some_column_2 = foo_2; 
SELECT some_column FROM some_table WHERE some_column_2 = foo_3; 
... 
SELECT some_column FROM some_table WHERE some_column_2 = foo_9999; 
SELECT some_column FROM some_table WHERE some_column_2 = foo_10000; 

我運行一個非常大的數字非常相似的查詢。

每個查詢的單個結果都很重要。即使給定的查詢不會產生任何結果。

不幸的是,目前製作數千個查詢的方法非常耗時且效率極低。

所以,我的問題是:有什麼辦法可以將此過程壓縮爲單個查詢,以便更有效地運行?

我覺得在MySQL中這應該是絕對可行的,我相當肯定我在這裏失去了一些東西。


到目前爲止,我已經使用MySQL連接器/ Python的executemany()函數嘗試,就像這樣:

cursor.executemany("SELECT some_column FROM some_table WHERE some_column_2 = %s", foo_list) 

我預計產生的結果,每一個人查詢的列表,但優化儘可能多的查詢。不幸的是,這似乎在MySQL Connector/Python中不起作用,並導致語法錯誤。

我在猜測,executemany並不意味着與SELECT語句一起使用,只能與INSERT語句一起使用。


我也搜索了互聯網的方式來執行批量選擇查詢,但我還沒有找到任何與我的情況相關的任何事情。

我想明確指出,

SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc); 

不是一個有效的解決方案,因爲它不從每個單獨保存查詢結果(或缺乏)。


任何與此協助將受到歡迎。

+0

是的,更有效率的東西會更有效率。 – Strawberry

+0

請參閱[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE](http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for - 什麼似乎對我來說是一個非常簡單的SQL查詢) – Strawberry

+0

爲什麼不獲取'some_column_2'以及單個SELECT查詢並顯式映射(使用字典)「some_column_2」與對應的「some_column」? –

回答

1

不是

SELECT some_column FROM some_table WHERE some_column_2 IN(FOO_1,FOO_2,...,foo_N);

簡單地問了

SELECT some_column, some_column_2 FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N); 

代碼生成查詢知道foo的1..N值,並會看到他們的子集,回來在列2的結果。

作爲一個單獨的問題,使用IN通常是一種反模式,它會干擾mysql優化器創建好計劃的能力。對於大的IN子句,您可能會發現最好避免填充FOO表,並加入這個問題。

+0

我決定創建一個新表並使用JOIN語句。這似乎是最佳的行動方針。感謝您指出我正確的方向(我對MySQL很新穎)。 –

0

我接受了J H的回答,因爲它提供了我正在尋找的信息。不過,我也會將其作爲他們建議的具體實現進行公佈:

cursor.execute("CREATE TABLE foo_table (foo VARCHAR(20))") 
insert_query = "INSERT INTO foo_table (foo) VALUES (%s)" 
cursor.executemany(insert_query, foo_list) 
select_query = "SELECT some_table.some_column FROM some_table RIGHT JOIN foo_table on some_table.foo = foo_table.foo GROUP BY 1" 
cursor.execute(select_query) 

這似乎按預期工作。

編輯:因爲,由於某種原因,Python的MySQL連接器/ Python中的光標對象將簡單地省略「空」值,它仍然是必須配對「some_column」和「富」值。因爲,就我而言,每個「some_column」值對於每個「foo」值都是完全獨特的,所以我可以使用ANY_VALUE()來執行此操作。

+0

'group by 1'有點奇怪,我想它適用於'some_column'組,我希望它有一個唯一的索引,或者至少一個索引。 –

+1

我強烈建議添加一個PK:'CREATE TABLE foo_table(foo VARCHAR(20)primary key)''。通常,每個關係都應該有一個主鍵,即使它是跨越幾列的複合關鍵字。對於這個特定的JOIN,你確實希望優化器在確定哪個是驅動表時要利用唯一索引。使用EXPLAIN來驗證你的連接條款是否合理。 (https://www.sitepoint.com/using-explain-to-write-better-mysql-queries/) –

+0

使用主鍵在優化方面更好?很高興知道,謝謝。我對MySQL不是很熟悉。 –