用于选择多个行的最佳mysql查询,每个行都需要来自多个子表的多个关联行

时间:2011-02-16 03:15:27

标签: php sql mysql database

哇,标题是满口的。我再次发现自己不知道如何提出这个问题,所以我将使用一个例子。假设你正在制作一款有物品的游戏。物品有效果,奖金和要求。

因此,items表中的每条记录在效果表,奖金表和要求表中都有多个子记录。

你想要选择100个最近的项目,包括他们在游戏中显示的所有效果,奖金和要求。

实现这一目标的最佳方法是什么。可以在一个查询中完成吗?这是否实用?感谢。

2 个答案:

答案 0 :(得分: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次查询。

如果您在网页上显示此内容,则分页(显示1-20 of 100)将降低该数字。

您使用的方法实际上取决于您的情况。需要考虑的事项:

  • 使用频率
  • 他们真的需要一次看100件物品
  • 他们是否需要在一个关系中查看所有关系(单击一个项目以查看其效果等)

答案 1 :(得分:-1)

你应该可以做这样的事......

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

为了澄清,events.aid是用户的唯一ID。因此,当我获取所有这些记录并按事件对它们进行分组时,我会获得所有唯一事件昵称和创建它们的用户的列表。 enter image description here