哇,标题是满口的。我再次发现自己不知道如何提出这个问题,所以我将使用一个例子。假设你正在制作一款有物品的游戏。物品有效果,奖金和要求。
因此,items表中的每条记录在效果表,奖金表和要求表中都有多个子记录。
你想要选择100个最近的项目,包括他们在游戏中显示的所有效果,奖金和要求。
实现这一目标的最佳方法是什么。可以在一个查询中完成吗?这是否实用?感谢。
答案 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)将降低该数字。
您使用的方法实际上取决于您的情况。需要考虑的事项:
答案 1 :(得分:-1)
你应该可以做这样的事......
SELECT `users`.`nickname` , `events`.`nickname`
FROM `users` , `events`
WHERE `events`.`aid` = `users`.`aid`
GROUP BY `events`.`nickname`
为了澄清,events.aid是用户的唯一ID。因此,当我获取所有这些记录并按事件对它们进行分组时,我会获得所有唯一事件昵称和创建它们的用户的列表。