【问题标题】:Show range according to the number of points in PHP根据PHP中的点数显示范围
【发布时间】:2015-03-07 14:26:43
【问题描述】:

我需要建议。

我有一个简单的 while 循环。 我有一个表参赛者。每个参赛者都有一个总栏[celkem]。

这些数据在循环中摘录

当你也有两个点时我需要它,所以它总是在范围内(见图)

其余部分摘录如下: $ row ['name']; $ 行 ['bodycelkem']

我的问题是,如何使用 PHP 和 MySQL 转储这个范围命令?

编辑: SQLFiddler

(我需要自动排名范围内的点)

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • @Strawberry 我用数据填充了 SQL
  • 您是否想从您在此处发布的内容的第一列中获取范围? 3. - 4. 等?我不明白得到的问题。如果是这样,请查看dev.mysql.com/doc/refman/5.0/en/range-optimization.htmlmysqltutorial.org/mysql-between 很难说出您想要实现的目标。
  • @Fred-ii- 哦不,我会试着澄清一下。我有一个 mysql 数据库和其中的数据。这些数据在文档中回显。我正在尝试,当列出的顺序应该是四行具有相同数量的点(见 img)我想排名 5。 - 8。接下来是 9。我在名称之前有 echo rank。
  • 尝试WHERE celkem = '87,3' GROUP BY celkem,如果这是您的要求。或者简单地GROUP BY celkem,否则。请向我们展示您 100% 确定的预期结果。

标签: php mysql sql mariadb


【解决方案1】:

由于Poradi 信息不存在,您需要对其进行推断。您可以使用变量来执行此操作。请参阅下面的我的 SQL 或 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`

这是如何工作的?

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

【讨论】:

    【解决方案2】:

    这里有一个想法

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多