2011-02-16 48 views
1

哎呀,標題是一口。我再次發現自己不知道如何問這個問題,所以我會用一個例子。假設你正在製作一款包含物品的遊戲。物品有效果,獎金和要求。最好的mysql查詢選擇多個行,每個行需要多個子表的多個關聯行

因此,items表中的每條記錄在效果表,獎金錶和需求表中都有多個子記錄。

而你想要選擇100個最近的項目,包括他們在遊戲中顯示的所有效果,獎金和要求。

什麼是最優化的方式來完成此操作。它可以在一個查詢中完成嗎?而且這是否實際?謝謝。

+0

爲什麼你不想使用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

+0

我需要幾個效果,獎勵和請求PER項目。我的理解是,這會爲每件物品返回1點效果,1點獎勵和1點需求。我錯了嗎? – Ryan 2011-02-16 04:42:30

+0

它將返回所選項目的所有效果,獎金和要求。如果你有沒有效果,獎金或要求的物品,你應該使用LEFT JOIN – criticus 2011-02-16 04:51:20

回答

1

它可以在一個查詢中實現,但它會相當大,並會有很多倍增。在一個查詢中做這種事情的唯一真正理想的時間是如果存在「有一個」關係。即一個項目有一個效果,可以通過簡單的連接來完成,而一個項目只返回一個演出。

以你給出的一個簡單的例子。你有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)將降低該數字。

你使用的方法真的取決於你的情況。需要考慮的事情:

  • 多久將這種使用
  • 他們真的需要看到100個項目一次
  • 他們需要看到的所有關係的一個(點擊一個項目以查看其效果等)
-1

您應該能夠待辦事項這樣的事情...

SELECT `users`.`nickname` , `events`.`nickname` 
FROM `users` , `events` 
WHERE `events`.`aid` = `users`.`aid` 
GROUP BY `events`.`nickname` 

爲了澄清,events.aid是uniq的ue用戶的ID。因此,當我獲取所有這些記錄並按事件對它們進行分組時,我會得到所有唯一事件暱稱以及創建它們的用戶的列表。 enter image description here