从mysql表中选择3行,然后获取每一行的特定列

时间:2012-07-05 08:02:53

标签: php mysql

  1. 从table1中选择3行
  2. 从每行中获取特定的列数据。
  3. 然后使用获得的每个列数据再次进行查询以从table2获取数据。
  4. 将步骤4中获得的数据存储到每行的变量中。
  5. 然后把它们放在json数组中(表1,3行+表2的数据(每个数据)。
  6. 我正在构建一个排名表,它显示排名前三位的用户。 例如: 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将其编码。

    我该怎么做?

5 个答案:

答案 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

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

如果你的任何一个等级名称都有逗号,那么我们需要添加一些小调整,但我不会想到他们会这样做,所以我把它留下来以保持简单。