2011-09-01 123 views
0

好的,所以我使用PHP和MySQL来创建一个家族名册页面。我有几个不同的表,我需要使用这个查询。这里是我的表是如何布局:MySQL左加入帮助

  • 会员 - 普通会员表
  • roster_members - MEMBERID,游戏ID,rosterXP(经验点的部件已经赢得了该名册)
  • clan_ranks - 标题,minimumXP
  • roster_games - 表中特定的游戏,其成员是

的一部分所以我想要做的就是创建一个查询,通过战队排名小组成员(minimumXP按降序排列)。他们的氏族排名由clan_rank minimumXP低于roster_member(WHERE minimumXP < rosterXP LIMIT 1)决定。我将如何创建这样的东西?我假设我需要使用左连接或右连接...不知道有什么区别。无论如何,这是我已经提出的查询,但我敢肯定,它不会工作。我将不胜感激,如果有人可以帮助指出任何我需要添加等

SELECT cr.id   AS crid, 
     cr.title  AS rank_title, 
     cr.minimumxp AS rank_min, 
     cr.abbreviation AS rank_abbr, 
     cr.image  AS rank_image, 
     rm.memberid  AS member_id, 
     rm.rosterxp  AS roster_xp, 
     rm.gameid  AS game_id 

FROM ".DB_PREFIX."roster_members AS rm 
LEFT JOIN ".DB_PREFIX."clan_ranks AS cr ON (cr.minimumXP < rm.rosterXP) 
WHERE rm.gameID = ".$gameID." 
GROUP BY cr.id 
ORDER BY rm.rosterXP DESC 
+0

我“米真的有困难所著的Grokking你的段落,以及扩展名,你的目标,也许你可以重新组合,或者更好的是,显示一个示例输出(一个表格,显示你期望看到的) –

+0

我想获得成员结果并根据他们的结果对结果进行分组rosterXP。 – ShoeLace1291

回答

0

认为我会明白你的目标。如果是这样,我不认为你的意思是你想按氏族排名,就像你说的那样 - 我想你是根据氏族排名来加入的。

SELECT rm.memberid  AS member_id, 
     rm.rosterxp  AS roster_xp, 
     rm.gameid  AS game_id, 
     cr.id   AS crid, 
     cr.title  AS rank_title, 
     cr.minimumxp AS rank_min, 
     cr.abbreviation AS rank_abbr, 
     cr.image  AS rank_image 
FROM roster_members AS rm 
LEFT JOIN clan_ranks AS cr ON cr.minimumXP = 
    (SELECT crm.minimumXP 
     FROM clan_ranks crm 
     WHERE crm.minimumXP < rm.rosterXP 
     ORDER BY minimumXP DESC limit 1) 
WHERE rm.gameID = :game_id 
ORDER BY rm.rosterXP DESC 

LEFT JOIN如果你有roster_members.rosterXP值是比你的最低clan_ranks.minimumXP下才是必需的。如果是不是的情况下,比INNER JOIN就足够了。

LEFTRIGHTINNER加入之间的区别如下:

  • INNER JOIN将结果限制为表中的完全匹配“两”边(记录在“左”的记录和根据ON子句存在“权利”
  • A LEFT JOIN指出,指定给“左”连接的表的所有记录都将包含在内,即使记录不包含“对'右'的表格存在。如果记录不存在,NULL值将替换为为该表指定的每个字段。
  • A RIGHT JOIN只是与LEFT JOIN相反。

请注意,我重新安排了字段的位置。这是为了可读性,基于clan_ranks中不存在记录的可能性。如果它们不存在,则您看到的第一个字段将包含数据(来自roster_members),结果集中右侧的字段将为NULL。这不以任何方式要求 - 仅仅是一个约定。

此外,我删除了数据库前缀并添加了一个占位符以提高可读性。

0

这里棘手的是成员和家族的关系。假设氏族级别包含

title  minxp 
------  ------ 
chieftan 100 
warrior  50 
serf  5 

有120分的人大概是chieftan。但试图实现这一点作为一个SQL查询,只有只有返回chieftan的排名是有点棘手。事实上,虽然可以编写一个SQL查询来返回它,但生命太短了。

通过将氏族等级表的结构更改为title,minxp,maxxp,可以大大简化问题。这是一个有点的开销,以保持数据的,但使查询得多,简单得多:

title  minxp maxxp 
------  ------ ----- 
chieftan 100  999999999 
warrior  50  100 
serf  5  50 

SELECT .... 
FROM ".DB_PREFIX."roster_members AS rm 
LEFT JOIN ".DB_PREFIX."clan_ranks AS cr 
    ON (rm.rosterXP >= cr.minimumXP AND rm.rosterXP < cr.maximumXP) 
WHERE rm.gameID = ".$gameID." 
GROUP BY cr.id 
ORDER BY rm.rosterXP DESC 

或者,您也可以使用查找功能....

CREATE FUNCTION getrank(p_xp INTEGER) 
    RETURNS varchar(50) CHARSET ascii 
READS SQL DATA 
BEGIN 
    DECLARE l_rank VARCHAR(50); 

    SELECT title 
    INTO l_rank 
    FROM clan_ranks 
    WHERE minxp<p_xp 
    ORDER BY minxp DESC 
    LIMIT 0,1; 

    RETURN l_rank; 
END;