簡體   English   中英

最好的mysql查詢,用於從多個子表中選擇多個行,每個行都需要多個關聯行

[英]best mysql query for selecting multiple rows that each need multiple associative rows from several child tables

Wh,這個標題是滿嘴的。 我再次發現自己不知道該怎么問這個問題,因此我將舉一個例子。 假設您正在制作一個包含物品的游戲。 項目具有效果,獎金和要求。

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

假設您要選擇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個查詢。

如果要在網頁上顯示此內容,則分頁(顯示1-20 of 100)將降低該數字。

您使用的方法實際上取決於您的情況。 注意事項:

  • 多久使用一次
  • 他們真的需要一次看到100個項目嗎
  • 他們是否需要一次查看所有關系(單擊一個項目即可查看其效果,等等)。

你應該可以做這樣的事情...

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

為了明確起見,events.aid是用戶的唯一ID。 因此,當我獲取所有這些記錄並按事件對它們進行分組時,我將獲得所有唯一事件昵稱以及創建它們的用戶的列表。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM