大家好。我在運行查詢/ php組合時遇到了一些麻煩。我似乎只是在我的php循環內循環中的太多結果集。我確信有一個更有效的方法來做到這一點。非常感謝任何幫助。檢查食譜中是否含有成分 - MYSQL
我有持有3500個食譜([配方])的表:
rid | recipe_name
而且保存600種不同的成分([配料])
iid | i_name
每個另一個表配方有x個關聯的成分,我用一個不錯的連接表來創建關聯([recipe_ingredients])
uid | rid | iid
(其中uid是隻爲表的唯一ID)
例如:
rid: 1 | recipe_name: Lemon Tart
.....
iid: 99 | i_name: lemon curd
iid: 154 | i_name: flour
.....
1 | 1 | 99
2 | 1 | 154
我試圖運行查詢,允許用戶輸入他們有什麼成分,它會告訴你任何你可以用這些成分。它不必使用所有的配料,但你需要擁有配方的所有成分。例如,如果我有面粉,雞蛋,鹽,牛奶和檸檬醬,我可以做'煎餅','檸檬餡餅'(如果我們假設檸檬撻沒有其他成分:)),但不能使'燴飯'(因爲我沒有米飯,或者其他任何需要的東西)。
在我的PHP我有一個數組包含用戶擁有的所有成分。目前他們的方式我正在運行這是通過每個配方(循環1),然後檢查該配方中的所有成分,以查看每種成分是否包含在我的成分數組中(循環2)。只要它在配方中找到一種配料,並不在我的配方中,它就會顯示「否」並進入下一個配方。如果是這樣,它將把rid存儲在一個新的數組中,我稍後使用它來顯示結果。
但是,如果我們看一下效率,如果我假設3500個食譜,並且我的數組中有40種成分,最壞的情況是它運行3500 x 40n,其中n =配方中成分的數量。最好的情況仍然是3500×40(沒有找到一個配料第一次爲每個配方如此退出)。
我認爲我的整個方法是錯誤的,我認爲這裏必須有一些聰明的SQL。有什麼想法嗎?我總是可以從配料陣列我有建立一個SQL語句......
非常感謝提前,大加讚賞
是的,我確實在表格中存儲了配方的配料數量,並注意規範化(或缺乏)。不完全確定只是通過閱讀查詢「ing」創建的表上的連接,但會運行並讓您知道...... – 2011-04-06 16:11:15
ing表上的連接是如何篩選成分列表。因爲它是一個內部連接,任何與您提供的列表不匹配的配方都將退出,您不必將這些配料連接到其他表格。 – schizodactyl 2011-04-06 16:23:00
請注意,您可以使用IN ANY查詢,就像其他地方所討論的一樣,但就執行速度而言,查詢將是相同的 - 它主要只是語義。我傾向於避免在任何查詢中使用,因爲它們不能用於準備好的語句,儘管準備好的語句在您的情況下不是很有用,因爲成分的數量是可變的。 – schizodactyl 2011-04-06 16:25:13