Php 用空行填充查询结果

Php 用空行填充查询结果,php,sql,mysql,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引用照片等。在M

我有以下查询,用于返回游戏中的最高分数,但如果记录少于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引用照片等。

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

SELECT  id, MAX(score) mscore
FROM    scores
WHERE   id IN (".implode(',', $data).") 
GROUP BY
        id
ORDER BY
        mscore DESC
LIMIT   10
不要在mysql中这样做。 使用php获取结果集时,只需根据需要添加空结果。 (表示空数组字段)

然后继续添加空行,直到集合中正好有10个结果

while(count($data) <= 10)
{
    $data[] = array();
}
while(count($data)就像@Thariaman所说的(+1)不要在MySql中这样做,因为它会更麻烦,将来也更难支持

我会尝试类似的方法(用空键填充数组,这样脚本在试图访问它们(或其他)时不会抛出警告)

函数getMaxScores($gameid){ $result=query(“从分数中选择id、MAX(分数)mscore”。 其中id位于(“.infrade(',',$data)。”)。 “按id分组按mscore描述的订单限制10” ); 如果(计数($result)<10){ $result=array\u pad($result,10,数组(“id”=>,“mscore”=>); } 返回$result; }
虽然我同意您应该在脚本中而不是在查询本身中处理此问题,但我想到的一件事是:

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
但是如果我在评论中看到这样的代码,开发人员会得到一个“orly?”注释;-)

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

在脚本中执行此操作时,为什么要在sql中执行此操作?只需一件事,我需要数组携带ID,如果分数为空,则可以为什么我认为用sql更容易实现呢
for($i=0; $i<=10; $i++)
{
    if(isset($data[$i]))
    {
        //Show data from $data[$i]
    }else
    {
        show block row.
    }
}
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;
}
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