2012-11-22 94 views
0

我是新来的PHP和MySQL,我尝试了2天创建一个Web应用程序,它可以存储有关用户从窗体中的特定数据,并允许用户基于类似的稍复杂的形式。我得到的表单工作,也输入到数据库,但我有接收来自MySQL的数据的问题,也许将来我也会与搜索功能,但我没有多少考虑。现在我专注于从db中获取特定数据。有多个连接的查询和太多的结果返回

SELECT players.*, 
    brackets.name AS interested_in, 
    classes.name AS looking_for, 
    tags.name AS tagged_with 
FROM players JOIN player_brackets ON (players.id = player_brackets.player_id) 
JOIN brackets ON (player_brackets.bracket_id = brackets.id) 
JOIN player_classes ON (player_brackets.player_id = player_classes.player_id) 
JOIN classes ON (player_classes.class_id = classes.id) 
JOIN player_tags ON (player_classes.player_id = player_tags.player_id) 
JOIN tags ON (player_tags.tag_id = tags.id) 
WHERE players.id = '18' 

我有这个疑问,工作正常,但我从中得到的数据是在数据库中的数据的每一个组合,其目前约100项多成果,这是几乎一样的。它将数据结果乘以数据库中的字段数,例如玩家(1)*括号(3)*类别(11)*标记(5),它将输出165行几乎相同的数据,其中括号,类别和标签。

如果我将结果分组players.id,我只得到一行,但来自其他字段的数据丢失。我想得到1行将包含所有它(col可能与数组中的多个数据)。

DB有7个表 - 玩家,标签,类,括号和3个表,其中包含玩家ID和标签/类/括号id组合。

我一直在寻找网页和SO但没有真正帮助了我。如果有人能帮助我解决这个问题,那将会非常好。感谢您的回复,我很抱歉我的英文不是我的主要语言。

+0

你不是应该使用INNER JOIN代替JOIN? –

+0

INNER JOIN和JOIN为我输出完全相同的结果。我也尝试了SELECT DISTINCT,但它们都一样。 –

+2

你可以在这里发布你的模式吗?还有,“GROUP BY players.id”怎么样? –

回答

0

当你加入,MySQL是要给你每一个组合。

正如你所看到的,你可以GROUP BY,但随后它只会给你一个组合。

我认为你正在寻找一系列的查询(“获得玩家1的所有括号”,然后“获得玩家1的所有职业12”)等等。

或者你可以在应用智能分析的结果。

还有GROUP_CONCAT,但很少满足任何人的需求(因为它返回为一个字符串)。

+0

因此,如果我想输出的格式像多维数组这样会包含每行的字符串/ int而不是数组的多标签比我需要多个查询,对吗?我不想这样做,因为它会减慢程序的运行速度,但如果它的方式比我想的更糟糕,那么将所有内容存储在一张表中并将多个标签转换并存储为字符串而不是输出时会更好串返回到一个数组。 –

+0

您的查询应该足够快,以使其中有多个不会以任何明显的方式减慢您的速度。我不会建议在这个阶段对数据进行非规范化处理。 –

+0

谢谢你,我重写了db结构和它的工作正常。你说得对,速度差异很小,以至于它不重要,所以我会试验你将来的建议。 –