我正在构建一个排名表,它显示排名前三位的用户。 例如: User1有2000分,用户2有4000分,用户3有10k分,所以前3名用户是: 用户3&gt; <用户2>用户1
所以,我想让php转到'用户'表并使用它来获得前3名成员:
$query = mysql_query("SELECT * FROM users ORDER BY pts DESC LIMIT 3");
$rows = array();
while($r = mysql_fetch_assoc($query)) {
$rows[] = $r;
}
“用户”的表格结构:
1.username(VARCHAR)
2.pts(INT)
将行放入数组后,如何为该数组中的每一行获取“点数”。 然后转到“排名”表格,获取排名。
“排名”的表格结构:
1.rank(VARCHAR)
2.pts(INT)
在排名表中有'pts'让php根据数组中每行的点选择比较用户所在的排名。
通常我会使用它,如果它仅适用于1个用户,但对于多个用户,我不确定:
$result = mysql_query("SELECT * FROM rank WHERE pts <= '$upts' ORDER BY pts DESC LIMIT 1")
or die(mysql_error());
然后在获得前3名用户的排名后,php现在将向该阵列中的每个用户(行)添加排名(当然,将其添加到排名所有者,而不仅仅是将其放入)。
然后JSON将其编码。
我该怎么做?
答案 0 :(得分:1)
我不确定这是不是你想要的。这是将两个查询合并为一个查询。请查看http://sqlfiddle.com/#!2/ad419/8
SELECT user.username,user.pts,rank.rank
FROM user LEFT JOIN rank
ON user.pts <=rank.pts group by user.id
更新:
对于提取前三名,可以执行以下操作;
SELECT user.username,user.pts,rank.rank
FROM user LEFT JOIN rank
ON user.pts <=rank.pts
GROUP BY user.id
ORDER BY pts DESC LIMIT 3
答案 1 :(得分:0)
如果我理解正确,您需要从Rank和Users表中获取值。为了在一个查询中执行此操作您需要将FK(外键)添加到Rank表中,该表指向Users表中的特定用户。
所以你需要将userId添加到Rank表中,然后你可以运行:
SELECT r.rank, u.points from users u,rank r where u.userId = r.userId
这大致是你需要的。
答案 2 :(得分:0)
不完全是您确切问题的答案,但这可能对您有用:How to get rank using mysql query。甚至可能意味着您不需要排名表。如果这没有帮助,我会稍后再查看。
答案 3 :(得分:0)
使用此查询
$query = "SELECT
u.pts,
r.rank
FROM users as u
left join ranks as r
on r.pts = u .pts
ORDER BY pts DESC
LIMIT 3";
这将带来您所需的内容而无需放入数组
$rec = mysql_query($query);
$results = arrau();
while($row = mysql_fetch_row($rec)){
$results[] = $row;
}
echo json_encode($results);
答案 4 :(得分:0)
看起来你要做的就是检索用户实际遇到的最高点要求的排名,这不是其他人在这里给出的。幸运的是,很容易在单个查询中使用一个不错的小技巧来完成此操作:
SELECT
user.username,
SUBSTRING_INDEX(GROUP_CONCAT(rank.rank ORDER BY pts DESC),",",1) AS `rank`
FROM user
LEFT JOIN rank ON user.pts >= rank.pts
GROUP BY user.id
ORDER BY pts DESC
LIMIT 3
基本上第二位正在做的是生成用户已经达到的所有等级的列表,按点的降序排序然后选择第一个。
如果你的任何一个等级名称都有逗号,那么我们需要添加一些小调整,但我不会想到他们会这样做,所以我把它留下来以保持简单。