X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Как определить порядковый номер записи в БД?
B.B.
B.B.
Topic Starter сообщение 16.2.2011, 21:08; Ответить: B.B.
Сообщение #1


Упорядочиваю БД (mysql) по какому либо параметру. Далее ищу определенную запись. Скажите можно ли как нибудь (не в цикле while, методом перебора прибавляя к счетчику +1) узнать на каком месте эта запись находится при данном упорядочивании?

Хочу пояснить для чего мне это нужно. Предполагаю, что если БД будет очень большая и нужная запись после упорядочивания окажется ближе к концу, то это будет оч. напрягать CPU сервера. Или я ошибаюсь?

Если вопрос не корректно / не понятно задан, то попробую перефразировать.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 16.2.2011, 23:54; Ответить: Mulder_hb
Сообщение #2


А зачем упорядочивать, а потом искать? Ищите сразу:
SELECT * FROM `table` WHERE `field` = 'value';

Если при этом field будет еще и индексом, то будет все замечательно.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
B.B.
B.B.
Topic Starter сообщение 17.2.2011, 0:11; Ответить: B.B.
Сообщение #3


Видимо Вы не поняли. Вот допустим как на главной странице этого форума активные пользователи:

1 Webmaster 6,811
2 Licoric 4,169
3 MetSerp 2,670
4 alexdrob 2,520
5 Diablo 2,405
6 Apay 2,196
7 Letmetouchyou 2,172
8 Ramster 1,838
9 Exterior 1,780
10 Nightfly 1,681

Вырисовывается примерно такая БД: "Логин" "Кол-во сообщений" "ID" ну и т.д. Так вот, чтобы определить "самого печатающего" пользователя мне нужно упорядочить мою БД по "Кол-ву сообщений", а потом чтобы определить позицию определенного пользователя в этом рейтинге я перебираю отсортированную бд в цикле while и добавляю временной переменной +1, пока не найду нужного. Когда нахожу нужного, то число временной переменной это и будет № позиции данного пользователя.

Возможно есть какие-то средства, чтобы обойтись без этой временной переменной и цикла?!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 17.2.2011, 0:56; Ответить: alexdrob
Сообщение #4


set @n = 0;
select `name`, @n:=@n+1 from `users` order by `name`;

Так? или я чего то не понял?)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
B.B.
B.B.
Topic Starter сообщение 17.2.2011, 2:26; Ответить: B.B.
Сообщение #5


Допустим у меня такая БД:

id name message
3 vanya 34
8 olya 76
12 zhenya 39

Меня интересует на каком месте Zhenya по количеству написанных сообщений, что я для этого делаю:
1. сортируем бд по количеству сообщений в порядке убывания.
[PHP]$a = mysql_query ("SELECT * FROM table ORDER BY message DESC");[/PHP]
2. затем перебираю все эти записи в цикле while:
[PHP]$chislo=1;
$b = mysql_fetch_array($a);
while ($b != NULL or $b[id] != 12)
{
$chislo = $chislo +1;
$b = mysql_fetch_array($a);
}[/PHP]
3. теперь переменная $chislo будет хранить номер позиции в рейтинге пользователя Zhenya.


Так вот вопрос в следующем: можно ли определить номер позиции в рейтинге пользователя "Женя" без цикла? С помощью SQL?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 17.2.2011, 4:09; Ответить: alexdrob
Сообщение #6


выполняешь код 1 раз он сохранится в базе
DELIMITER |
DROP PROCEDURE IF EXISTS find|
CREATE PROCEDURE find (IN v varchar(255))
BEGIN DECLARE done INT DEFAULT 0;
DECLARE n INT(11) DEFAULT 0;
DECLARE name VARCHAR(255);
DECLARE cur CURSOR FOR SELECT `username` FROM `table` ORDER BY `message` DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur;

read_loop: LOOP
FETCH cur INTO name; IF done THEN
LEAVE read_loop;
END IF;
SET n = n + 1;
IF name = v THEN
SELECT n;
LEAVE read_loop;
END IF;
END LOOP;

CLOSE cur;
END|
DELIMITER ;

определить позицию Женя

[PHP]$pos = mysql_result(mysql_query("call find('Женя')"),0);
echo "Женя на $pos месте!";[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 18.2.2011, 18:36; Ответить: Mulder_hb
Сообщение #7


Мой изврат
[PHP]<?php

mysql_query("SET @n := 0");
$result = mysql_query("SELECT DISTINCT IF ((@n := @n + 1) && (`name` = 'vasya'), @n, NULL) `position` FROM `table` ORDER BY `position` DESC");
$position = mysql_result($result, 0);[/PHP]
Хотя нужно смотреть всю задачу целиком. Вы будите в последствии выводить весь список пользователей? Например, первую десятку? Тогда проще сделать простой запрос и пройтись по нему циклом.
[PHP]<?php

$res = mysql_query("SELECT `name`, `messages` FROM `table` ORDER BY `messages` DESC");
for ($data = array(); $row = mysql_fetch_assoc($res); $data[] = $row);
$name = "John";
$position = array_search(array($name), $data);
$position++;
echo "$name на $position месте!";[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
B.B.
B.B.
Topic Starter сообщение 18.2.2011, 21:56; Ответить: B.B.
Сообщение #8


(alexdrob @ 17.2.2011, 06:09) *
выполняешь код 1 раз он сохранится в базе


В Вашем примере тоже цикл. Будет ли этот код выполняться быстрее, чем мой через while?

(alexdrob @ 17.2.2011, 06:09) *
определить позицию Женя

[PHP]$pos = mysql_result(mysql_query("call find('Женя')"),0);
echo "Женя на $pos месте!";[/PHP]


После проделанного так и не вывел он мне циферку.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
B.B.
B.B.
Topic Starter сообщение 18.2.2011, 22:05; Ответить: B.B.
Сообщение #9


(Mulder_hb @ 18.2.2011, 20:36) *
Мой изврат
[PHP]<?php

mysql_query("SET @n := 0");
$result = mysql_query("SELECT DISTINCT IF ((@n := @n + 1) && (`name` = 'vasya'), @n, NULL) `position` FROM `table` ORDER BY `position` DESC");
$position = mysql_result($result, 0);[/PHP]


Этот пример не совсем понятен. Ведь поля position у меня нет. Только id (INT), name (varchar) и message (INT).

Пробовал писать так:

[PHP]mysql_query("SET @n := 0");
$result = mysql_query("SELECT DISTINCT IF ((@n := @n + 1) && (`name` = 'vasya'), @n, NULL) `message` FROM `table` ORDER BY `message` DESC");
$position = mysql_result($result, 0);[/PHP]

Выводит не понятные цифры.

(Mulder_hb @ 18.2.2011, 20:36) *
Хотя нужно смотреть всю задачу целиком. Вы будите в последствии выводить весь список пользователей? Например, первую десятку? Тогда проще сделать простой запрос и пройтись по нему циклом.


Мне нужно именно определить позицию в рейтинге определенного пользователя.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 18.2.2011, 23:03; Ответить: alexdrob
Сообщение #10


(B.B. @ 18.2.2011, 23:56) *
После проделанного так и не вывел он мне циферку.

Если вы просто скопировали мой код, то он врятли вам выведет, я же не знаю название полей ваших) Подгоните запросы под свою таблицу.

(B.B. @ 18.2.2011, 23:56) *
В Вашем примере тоже цикл. Будет ли этот код выполняться быстрее, чем мой через while?

Не могу сказать) Мой код выполнится в mysql а ваш в php это основная разница. могу сказать одно, нагрузки именно на пхп будет меньше, и память меньше будет на пхп израсходована, так как не будут все пользователи возвращены.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Большие ставки для кликов в Я.Директ. Как удешевить?
2 rownong27 1120 26.3.2024, 14:13
автор: knezevolk
Открытая тема (нет новых ответов) Как вы бросили работу и перешли на заработок с сайтов?
12 uahomka 2291 25.3.2024, 6:52
автор: Skyworker
Открытая тема (нет новых ответов) Как отозвать банковский платеж фрилансеру?
28 metvekot 3913 25.3.2024, 6:34
автор: Skyworker
Открытая тема (нет новых ответов) Как вывести деньги в Украине с заблокированного Юмани ?
23 freeax 3640 24.3.2024, 20:55
автор: Liudmila
Открытая тема (нет новых ответов) Через какой браузер и как можно найти в кэшэ браузера видео
10 Room 1934 23.3.2024, 7:41
автор: Room


 



RSS Текстовая версия Сейчас: 29.3.2024, 2:20
Дизайн