1
  1. 从 table1 中选择 3 行
  2. 从每一行中获取特定的列数据。
  3. 然后使用获得的每一列数据,再次查询从table2中获取数据。
  4. 将步骤 4 中获得的数据存储到每行的变量中。
  5. 然后将它们放入 json 数组(表 1,3 行 + 表 2 的数据(每个)。

我正在构建一个排名表,它显示排名前 3 的用户及其排名名称。例如:用户1有2000点,用户2有4000点,用户3有10k点,所以前3名用户是: 用户3>用户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;
}

' user ' 的表结构:
1.username(varchar)
2.pts(int)

将行放入数组后,如何为该数组中的每一行获取“点”。然后去'等级'表得到他们的等级名称

' rank ' 的表结构:
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 编码出来。

我怎样才能做到这一点?

4

5 回答 5

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

更新:

对于提取前 3 名,可以执行以下操作;

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
于 2012-07-05T08:51:34.443 回答
0

如果我理解正确,您需要从 Rank 和 Users 表中获取值。为了在一个查询中执行此操作,您需要将 FK(外键)添加到指向用户表中特定用户的排名表。

因此,您需要将 userId 添加到 Rank 表中,然后您可以运行:

SELECT r.rank, u.points from users u,rank r where u.userId = r.userId

这大致就是你需要的。

于 2012-07-05T08:09:06.967 回答
0

不完全是您确切问题的答案,但这可能对您有用:How to get rank using mysql query。甚至可能意味着您不需要排名表。如果这没有帮助,我会稍后再检查。

于 2012-07-05T08:11:16.840 回答
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);
于 2012-07-05T08:59:39.727 回答
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

基本上,第二位正在做的是生成用户已达到的所有等级的列表,按点的降序对它们进行排序,然后选择第一个。

如果您的任何等级名称中有逗号,那么我们需要添加另一个小调整,但我不会想到他们会,所以我把它省略了以保持简单。

于 2012-07-05T09:44:12.747 回答