根据 PHP 中的点数显示范围
Show range according to the number of points in PHP
我需要建议。
我有一个简单的 while 循环。
而我有table个参赛者。每个参赛者都有一个总栏目[celkem].
这些数据摘自循环while
当你也有两个点时我需要它,所以它总是在范围内(见图)
其余部分摘录如下:$ row ['name']; $行['bodycelkem']
我的问题是,如何使用PHP和MySQL dump this range order?
编辑:
SQLFiddler
(我需要在范围内自动排名)
因为 Poradi
信息不存在,你需要推断它。您可以使用变量来做到这一点。在下方或 SQLFiddle
中查看我的 SQL
SELECT `range`, jmeno, rangeData.celkem FROM `hraci`
LEFT JOIN (
SELECT
a1.*,
if( range_start = range_end,
range_start, CONCAT(range_start,", - ",range_end)
) `range`
FROM (
SELECT
q1.*,
(@runtot + 1) AS range_start,
(@runtot := @runtot + q1.num) range_end
FROM (
SELECT @rn:=@rn+1 rank, t1.num, t1.celkem FROM (
SELECT celkem, count(celkem) num FROM hraci GROUP BY celkem ORDER BY celkem DESC
) t1, (SELECT @rn:=0) t2
) q1, (SELECT @runtot:=0) q2
) a1
) rangeData ON hraci.`celkem` = rangeData.`celkem`
这是如何工作的?
- 将 'celkem' 值组合在一起,降序排列。汇总每个组中有多少 'celkem' 个值。
- 使用变量向该数据添加行计数
- 再次使用变量,保持 运行ning 组大小的总和,这将为我们提供 'range end'。在递增之前从最后一个 运行 中获取变量给我们 'range start'
- 如果起点和终点相同,就用起点。如果开始和结束不同,则显示两个值
- 我们现在有了 Poradi(射程?)。我们现在可以继续像往常一样收集我们的数据,但现在我们可以将这些组加入到名称中。
- 只需选择我们想要的列即可整理所有数据。
这是一个想法
DROP TABLE IF EXISTS hraci;
CREATE TABLE hraci (
jmeno VARCHAR(45) NULL,
celkem DOUBLE NULL)
ENGINE = InnoDB;
INSERT INTO hraci
(jmeno, celkem) VALUES
('Dan', 97.5),
('Adam', 97.2),
('Petr', 90.5),
('Pavel', 90.5),
('Michal', 87.3),
('Jan', 87.3),
('David', 87.3),
('Tomás', 87.3),
('Jarda', 85.2);
SELECT a.celkem
, a.jmeno
, CASE WHEN MIN(b.rank)-1 <> a.rank THEN CONCAT(a.rank,' - ',MIN(b.rank) - 1) ELSE a.rank END rank
FROM
( SELECT celkem
, jmeno
, FIND_IN_SET(celkem,celkems) rank
FROM hraci
CROSS
JOIN
( SELECT GROUP_CONCAT( celkem ORDER BY celkem DESC) celkems
FROM hraci
) x
) a
LEFT JOIN
( SELECT celkem
, jmeno
, FIND_IN_SET(celkem,celkems) rank
FROM hraci
CROSS
JOIN
( SELECT GROUP_CONCAT( celkem ORDER BY celkem DESC) celkems
FROM hraci
) y
) b
ON b.rank > a.rank
GROUP BY a.celkem,a.jmeno;
+--------+--------+-------+
| celkem | jmeno | rank |
+--------+--------+-------+
| 85.2 | Jarda | 9 |
| 87.3 | David | 5 - 8 |
| 87.3 | Jan | 5 - 8 |
| 87.3 | Michal | 5 - 8 |
| 87.3 | Tomás | 5 - 8 |
| 90.5 | Pavel | 3 - 4 |
| 90.5 | Petr | 3 - 4 |
| 97.2 | Adam | 2 |
| 97.5 | Dan | 1 |
+--------+--------+-------+
我需要建议。
我有一个简单的 while 循环。 而我有table个参赛者。每个参赛者都有一个总栏目[celkem].
这些数据摘自循环while
当你也有两个点时我需要它,所以它总是在范围内(见图)
其余部分摘录如下:$ row ['name']; $行['bodycelkem']
我的问题是,如何使用PHP和MySQL dump this range order?
编辑: SQLFiddler
(我需要在范围内自动排名)
因为 Poradi
信息不存在,你需要推断它。您可以使用变量来做到这一点。在下方或 SQLFiddle
SELECT `range`, jmeno, rangeData.celkem FROM `hraci`
LEFT JOIN (
SELECT
a1.*,
if( range_start = range_end,
range_start, CONCAT(range_start,", - ",range_end)
) `range`
FROM (
SELECT
q1.*,
(@runtot + 1) AS range_start,
(@runtot := @runtot + q1.num) range_end
FROM (
SELECT @rn:=@rn+1 rank, t1.num, t1.celkem FROM (
SELECT celkem, count(celkem) num FROM hraci GROUP BY celkem ORDER BY celkem DESC
) t1, (SELECT @rn:=0) t2
) q1, (SELECT @runtot:=0) q2
) a1
) rangeData ON hraci.`celkem` = rangeData.`celkem`
这是如何工作的?
- 将 'celkem' 值组合在一起,降序排列。汇总每个组中有多少 'celkem' 个值。
- 使用变量向该数据添加行计数
- 再次使用变量,保持 运行ning 组大小的总和,这将为我们提供 'range end'。在递增之前从最后一个 运行 中获取变量给我们 'range start'
- 如果起点和终点相同,就用起点。如果开始和结束不同,则显示两个值
- 我们现在有了 Poradi(射程?)。我们现在可以继续像往常一样收集我们的数据,但现在我们可以将这些组加入到名称中。
- 只需选择我们想要的列即可整理所有数据。
这是一个想法
DROP TABLE IF EXISTS hraci;
CREATE TABLE hraci (
jmeno VARCHAR(45) NULL,
celkem DOUBLE NULL)
ENGINE = InnoDB;
INSERT INTO hraci
(jmeno, celkem) VALUES
('Dan', 97.5),
('Adam', 97.2),
('Petr', 90.5),
('Pavel', 90.5),
('Michal', 87.3),
('Jan', 87.3),
('David', 87.3),
('Tomás', 87.3),
('Jarda', 85.2);
SELECT a.celkem
, a.jmeno
, CASE WHEN MIN(b.rank)-1 <> a.rank THEN CONCAT(a.rank,' - ',MIN(b.rank) - 1) ELSE a.rank END rank
FROM
( SELECT celkem
, jmeno
, FIND_IN_SET(celkem,celkems) rank
FROM hraci
CROSS
JOIN
( SELECT GROUP_CONCAT( celkem ORDER BY celkem DESC) celkems
FROM hraci
) x
) a
LEFT JOIN
( SELECT celkem
, jmeno
, FIND_IN_SET(celkem,celkems) rank
FROM hraci
CROSS
JOIN
( SELECT GROUP_CONCAT( celkem ORDER BY celkem DESC) celkems
FROM hraci
) y
) b
ON b.rank > a.rank
GROUP BY a.celkem,a.jmeno;
+--------+--------+-------+
| celkem | jmeno | rank |
+--------+--------+-------+
| 85.2 | Jarda | 9 |
| 87.3 | David | 5 - 8 |
| 87.3 | Jan | 5 - 8 |
| 87.3 | Michal | 5 - 8 |
| 87.3 | Tomás | 5 - 8 |
| 90.5 | Pavel | 3 - 4 |
| 90.5 | Petr | 3 - 4 |
| 97.2 | Adam | 2 |
| 97.5 | Dan | 1 |
+--------+--------+-------+