mysql — Показать диапазон в зависимости от количества точек в переполнении стека

Мне нужен совет.

У меня есть простой цикл.
И у меня есть стол участников. У каждого участника есть общий столбец [celkem].

Эти данные за исключением цикла

И мне это нужно, когда у вас также есть две точки, чтобы они всегда были в пределах досягаемости (см. Рисунок)

http://i.stack.imgur.com/47bp5.png

Остальная часть выдержки примерно такая: $ row [‘name’]; $ row [‘bodycelkem’]

Мой вопрос, как использовать PHP и MySQL дамп этого диапазона диапазона?

Редактировать:
SQLFiddler

(Мне нужно авто ранг, где точка в диапазоне)

-2

Решение

Поскольку 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. Очистите все данные, просто выбрав нужные столбцы.
1

Другие решения

Вот одна идея

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

1

По вопросам рекламы [email protected]