根据 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`

这是如何工作的?

  1. 将 'celkem' 值组合在一起,降序排列。汇总每个组中有多少 'celkem' 个值。
  2. 使用变量向该数据添加行计数
  3. 再次使用变量,保持 运行ning 组大小的总和,这将为我们提供 'range end'。在递增之前从最后一个 运行 中获取变量给我们 'range start'
  4. 如果起点和终点相同,就用起点。如果开始和结束不同,则显示两个值
  5. 我们现在有了 Poradi(射程?)。我们现在可以继续像往常一样收集我们的数据,但现在我们可以将这些组加入到名称中。
  6. 只需选择我们想要的列即可整理所有数据。

这是一个想法

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     |
+--------+--------+-------+

http://sqlfiddle.com/#!9/2a7a5/2