spark108
@spark108

Как посчитать порядковый номер записи из базы MySQL?

Есть некая таблица в базе, в которой допустим есть колонки name (varchar) и value(int). Данные сортируются в порядке убывания или возрастания по полю value.

Задача вроде таки не сильно сложная. Забираем все записи из базы, перебираем циклом и считаем счётчиком до записи с нужным name.

Но тут втыкаешься в один неприятный момент. Записей в базе более 400 тысяч, что усложняет взятие всех записей в PHP скрипт тем, что PHP не выдерживаем такой объем данных и уходит в bad gateway.

Находил некоторые варианты с использованием SQL запросов, но я в SQL такой себе написатель, кроме как взять, добавить, изменить ничего не умею. С тригерами и функциями не работал, что косательно первой, то нашел 1 функцию, но она выполняется в PMA, за-то в PHP не хочет.
  • Вопрос задан
  • 697 просмотров
Решения вопроса 2
kawabanga
@kawabanga
Что-то мне кажется у вас в базе не так на этапе проектировки. На вид приходит только ладдерная лестница.

Можно сделать несколько запросов думаю.
Первым вытащить PK вашей записи, так как имя - так себе первичный ключ.
select id,name, value from {table} where name = "";

Берем поле value от этой таблицы с помощью php.

Делаем запрос на базу, в зависимости от сортировки, ставим < или >
select count (id) from {table} where value<{value_from_first}


можно конечно в один запрос запихнуть, но вам сложнее для понимания будет.
select count (id) from {table} where value<(select value from {table} where name = "")

Заметьте, что вы получите не точные результаты если будут одинаковые value у той записи, которую нужно получить.
Ответ написан
spark108
@spark108 Автор вопроса
Как обычно. Только напишу вопрос, так сразу пойму.

Так вот.

SELECT COUNT(DISTINCT `value`)+1 as `pos` FROM `table` WHERE `value` > (SELECT `value` FROM `table` WHERE `name`='key' LIMIT 1)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@levaleva266
# =========== условие над цыклом ==============

# Считаем количество записей в таблице `servers` поле (type=1), (type=2), (type=3).


$query = "SELECT SUM(type=1), SUM(type=2), SUM(type=3) FROM `servers` WHERE status = 1 order by id desc ";
$result = mysql_query($query);

if($row = mysql_fetch_array($result)){

$poz1 = ( $row['SUM(type=1)'] );
$poz2 = ( $row['SUM(type=2)'] );
$poz3 = ( $row['SUM(type=3)'] );

}

$poz_boost = ( 1 + ($poz3 - $poz3) + $page); // переменная "$page" это смещение записей пагинации на страницах, не лимит вывода на каждой странице, а именно смещение, то есть то на сколько записей вы переместились вперед при переходе на следующую страницу.
# ============ помещаем в цыкл ===============
# $poz = $poz_boost++; // переменную помещаем в цыкл, в моем случае это цыкл "while".
# ============================================
# tpl::set ( '{poz}' , $poz ); // вывод всем привычное "echo" и переменная "$poz" в моем случае выглядит именно так.
# ===========================================================================================

P . S На самом деле условие можно вообще не писать, а сделать так и тоже будет все идеально работать, но у вас на странице должна быть обязательно пагинация.

# ===========================================================================================

$poz_boost = ( 1 + $page); // переменная "$page" это смещение записей пагинации на страницах, не лимит вывода на каждой странице, а именно смещение, то есть то на сколько записей вы переместились вперед при переходе на следующую страницу.
# ============ помещаем в цыкл ===============
# $poz = $poz_boost++; // переменную помещаем в цыкл, в моем случае это цыкл "while".
# ============================================
# tpl::set ( '{poz}' , $poz ); // вывод всем привычное "echo" и переменная "$poz" в моем случае выглядит именно так.

# ==================================================================

Пример работы данного варианта можно посмотреть у меня на странице; boost-cs.com/promotion
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы