哎呀,標題是一口。我再次發現自己不知道如何問這個問題,所以我會用一個例子。假設你正在製作一款包含物品的遊戲。物品有效果,獎金和要求。最好的mysql查詢選擇多個行,每個行需要多個子表的多個關聯行
因此,items表中的每條記錄在效果表,獎金錶和需求表中都有多個子記錄。
而你想要選擇100個最近的項目,包括他們在遊戲中顯示的所有效果,獎金和要求。
什麼是最優化的方式來完成此操作。它可以在一個查詢中完成嗎?而且這是否實際?謝謝。
哎呀,標題是一口。我再次發現自己不知道如何問這個問題,所以我會用一個例子。假設你正在製作一款包含物品的遊戲。物品有效果,獎金和要求。最好的mysql查詢選擇多個行,每個行需要多個子表的多個關聯行
因此,items表中的每條記錄在效果表,獎金錶和需求表中都有多個子記錄。
而你想要選擇100個最近的項目,包括他們在遊戲中顯示的所有效果,獎金和要求。
什麼是最優化的方式來完成此操作。它可以在一個查詢中完成嗎?而且這是否實際?謝謝。
它可以在一個查詢中實現,但它會相當大,並會有很多倍增。在一個查詢中做這種事情的唯一真正理想的時間是如果存在「有一個」關係。即一個項目有一個效果,可以通過簡單的連接來完成,而一個項目只返回一個演出。
以你給出的一個簡單的例子。你有2個項目,每個項目有3個影響,有多對多的關係。
SELECT item.*, effect.*
FROM item
JOIN item_effect ON item.id = item_effect.item_id
JOIN effect ON effect.id = item_effect.effect_id
回報可能是:
item1 effect1
item1 effect2
item1 effect3
item2 effect2
item2 effect3
item2 effect4
然後,你將不得不通過循環和組所有項目的重新走到一起。通過與需求和修飾符的關係,查詢會變得更大,但仍然相當有條理。
您可以使用某種類型的ORM(對象關係映射)。這可以使您的代碼更具可讀性,例如使用來自Kohana的ORM的語法。
$items = ORM::factory('item')->find_all();
foreach($items as $item) {
$effects = $item->effects->find_all();
$bonuses = $item->bonuses->find_all();
$requirements = $item->requirement->find_all();
}
但是,對於100個項目的例子,你建議這將是301個查詢。
如果您在網頁上顯示此信息,則分頁(顯示100的1-20)將降低該數字。
你使用的方法真的取決於你的情況。需要考慮的事情:
您應該能夠待辦事項這樣的事情...
SELECT `users`.`nickname` , `events`.`nickname`
FROM `users` , `events`
WHERE `events`.`aid` = `users`.`aid`
GROUP BY `events`.`nickname`
爲了澄清,events.aid是uniq的ue用戶的ID。因此,當我獲取所有這些記錄並按事件對它們進行分組時,我會得到所有唯一事件暱稱以及創建它們的用戶的列表。
爲什麼你不想使用JOINS?這些桌子太大了嗎? `SELECT * FROM items JOIN影響物品.ID JOIN加分物品.ID JOIN要求ON物品。ID ORDER BY items.date DESC LIMIT 100` – criticus 2011-02-16 04:33:27
我需要幾個效果,獎勵和請求PER項目。我的理解是,這會爲每件物品返回1點效果,1點獎勵和1點需求。我錯了嗎? – Ryan 2011-02-16 04:42:30
它將返回所選項目的所有效果,獎金和要求。如果你有沒有效果,獎金或要求的物品,你應該使用LEFT JOIN – criticus 2011-02-16 04:51:20