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