使用空行填充查询结果

时间:2010-09-28 11:24:54

标签: php sql mysql

我有以下查询用于返回游戏中的最高分数,但如果记录少于10条,我希望它由空行填充:

SELECT id, MAX(score) mscore FROM scores WHERE id IN (".implode(',', $data).") GROUP BY id ORDER BY mscore DESC"

逻辑是将一组用户ID传递给查询,然后将对最高得分ID进行排序,并且将形成前十名,许多ID尚未得分,因此一些前十名查询只返回3或4行。我怎么能填写查询结果,直到我有10? ID引用照片等。

6 个答案:

答案 0 :(得分:4)

不要在mysql中执行此操作。 当您使用php获取结果集时,您只需根据需要添加空结果。 (表示空数组字段)

答案 1 :(得分:2)

就像@Thariaman所说的那样(+1)在MySql中不这样做,因为它将来会更加麻烦和难以支持。

我会尝试这样的事情(用空键填充数组,这样如果你试图访问它们(或者某些东西)你的脚本不会抛出警告)

function getMaxScores($gameid) {

    $result = query("SELECT id, MAX(score) mscore FROM scores ".
        "WHERE id IN (".implode(',', $data).")".
        "GROUP BY id ORDER BY mscore DESC LIMIT 10"
    );
    if(count($result) < 10) {
        $result = array_pad($result, 10, array("id" => "", "mscore" => "");
    }
    return $result;
}

答案 2 :(得分:0)

while($row = mysql_fetch_array($result))
{
    $data[] = $row;
}

然后继续添加空行,直到确切的10个结果为止。

while(count($data) <= 10)
{
    $data[] = array();
}

另一种方法是在输出时使用for循环和if语句,而不是foreach!

for($i=0; $i<=10; $i++)
{
    if(isset($data[$i]))
    {
        //Show data from $data[$i]
    }else
    {
        show block row.
    }
}

答案 3 :(得分:0)

虽然我同意你应该在你的脚本中而不是在查询本身中处理这个问题,但有一件事是我想到的:

SELECT * FROM (
  (
    SELECT id, MAX(score) mscore FROM scores
    WHERE id IN (1,4) GROUP BY id ORDER BY mscore DESC
  )
  UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')
  UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')
  UNION ALL(SELECT '--', '')UNION ALL(SELECT '--', '')
) as t LIMIT 10

但是,如果我在评论中看到这样的代码,开发人员会得到一个“o?rly?”注意; - )

答案 4 :(得分:0)

我将创建一个包含十行基本默认数据的默认表。 然后使用十个默认行的并集选择所需的记录,如果您正在进行硬编码,则将输出限制为10;如果不是,则将输出限制在默认表中。

答案 5 :(得分:-3)

在MySQL中,您可以使用limit选择前10行。

SELECT  id, MAX(score) mscore
FROM    scores
WHERE   id IN (".implode(',', $data).") 
GROUP BY
        id
ORDER BY
        mscore DESC
LIMIT   10