Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите составить запрос, Вывисти номер поля юзера под ником='лол' 
:(
    Опции темы
fuckerok
Дата 12.7.2005, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Здравтсвуйте.
Есть таблица где записываются статистика юзеров о посещаемости.
структура примерно такая nick email today week total
today - это поинты за сегодня
week - поинты за неделю
total - общее кол-во поинтов юзера.

Есть скрпит который хочется переписать для его быстродейсвия.
Скрипт показывает места юзеров, тоесть, например: сегодня 10 самых
понтовых это такие-то.
Вот запрос как примерно вывести лутшую десятку.
Код

SELECT * FROM users ORDER BY -today LIMIT 0 , 10;

Это не сложно.
Сложность состаит в том, что юзер может не находится на первом листе,
или даже на втором (В листе у меня по 10 юзеров, тоесть на первом листе
места от 0 да 9 на втором листе от 10 да 19, и тд) И вот тогда
приходится пользоватся поиском, который я так и не смог нормально написать.
Я делаю так:
Копирую всех юзеров в массив и начинаю искать ник уже в массиве, но это
очень долгий процесс потому-что кол-во юзеров перевалило за 10 тысяч.
Именно таким способом я могу узнать на каком месте неходится юзер, если
я просто начну искать его в sql базе, то я его найду, но не узнаю на
каком он месте, а мне важно именно это.
Мне нужно составить запрос примерно следущего содержания:
Вывисти номер поля юзера под ником='лол' при сортирове -today;
Или может кто-нибудь подскажет другую идею...
--------------------
PM MAIL ICQ   Вверх
Mont
Дата 12.7.2005, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Vingrad developer
Сообщений: 274
Регистрация: 13.11.2004
Где: Altay

Репутация: 2
Всего: 12



а если двумя запросами?
Код

$res=mysql_query("SELECT  today FROM users WHERE nick='лол' LIMIT 1");
$hit_user=mysql_fetch_array($res);
$res=mysql_query("SELECT count(*) FROM users WHERE today<".$hit_user);
$num_user=mysql_fetch_array($res);
echo "Номер пользователя - ".($num_user[0]+1);


Вот думаю так должно получиться


--------------------
"Если однажды Вдруг
Меня не окажется вовсе
в заповедной заветной тарелке
Твоего праведного сновидения
Знай - Неуловимые мстители настигли меня."
© Егор Летов
PM MAIL ICQ   Вверх
Opik
Дата 12.7.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 2
Всего: 55



Ты сначала отдельно посчитай на какой странице юсер, и потом показывай ту страницу.
PM MAIL Skype   Вверх
fuckerok
Дата 13.7.2005, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Mont
Спасибо, это выход, хотя хотелось бы в один запрос, но сойдёт и так.


Opik
Да вообщем я никогда этот sql не любил, вообще какой-то он левый язык.
Особенно бесит, что там нет чего-нить наподобе while
Так бы
SELECT COUNT(*) FROM users WHILE nick!='lol' ORDER BY -today;

Вообще, у меня складывается мнение, что sql придумал человек с садоМазахистскими наклонностями.
--------------------
PM MAIL ICQ   Вверх
Bikutoru
Дата 21.7.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата
у меня складывается мнение, что sql придумал человек с садоМазахистскими наклонностями.

Попрошу без наездов на SQL. Твоя задача может быть целиком на нём решена, между прочим
Код

--Переменная, в которой будем хранить очки юзера, набранные за сегодняшний день
SET @user_today = 0;

--Определение значения очков, набранных юзером лол сегодня
SELECT @user_today := today FROM users WHERE nick='лол' LIMIT 1;

--Переменная, в которой будем хранить позицию юзера
SET @position = 0;

--Определение текущей позиции юзера лол
SELECT @position := @position + 1 FROM users WHERE today >= @user_today ORDER BY today DESC;

--Определение начальной позиции "окна вывода"
SET @start_position = 10 * FLOOR(@position / 10);

--Определение числа выводимых записей (0, если юзер не найден)
SET @show_count = IF(@position > 0, 10, 0);

--ВЫборка 10 пользователей
SELECT * FROM users LIMIT @start_position, @show_count;

По-моему, довольно красивое решение. 7 запросов, два из которых (2 и 3 с конца) могут быть внесены в последний, и приведены отдельно они для большей удобочитаемости. Данные, возвращаемые всеми запросами кроме последнего, перебирать не нужно.

Для нормальной работы вот такой штуки
Код

SELECT @position := @position + 1 FROM users WHERE today <= @user_today;

нужен MySQL 4 версии. И все - задача решена.

Так что не возводи напраслину на SQL, а учи его лучше.
А насчет того, что нет while'ов - так в TransactSQL (MS SQL Server) и вроде бы в PL/SQL (Oracle) он есть. Если они тебе так уж нужны - переходи на одну из этих СУБД.

P.S. Рекомендую прочитать Хювяннен, Сеппяннен "Язык программирования LISP" - очень здорово учит мыслить не циклами и последовательно выполняющимися операторами...

Это сообщение отредактировал(а) Bikutoru - 21.7.2005, 18:20


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
fuckerok
Дата 23.7.2005, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Да, тут оба способа работают, но это при условии, что у юзера уникальное кол-во поинтов!
А вот в моей базе сложилось так, что у Васи, Пети, Маши и тд по 30 поинтов.
Тогда подобные способы не подходят.
Я конечно пробовал манипулировать ещё и с ником, но ничего не вышло.
Может есть какие-нибудь идеи... А то я всё тыкал и тыкал, но решения в этоге и не получил.
Как бы было всё просто, если бы был while
Надо сделать таким макаром чтобы запрос типа
Код
SELECT COUNT(*) FROM users WHERE today>=30 ORDER BY -today;

Завершался, если ник='вася'
Цитата

А насчет того, что нет while'ов - так в TransactSQL (MS SQL Server) и вроде бы в PL/SQL (Oracle) он есть. Если они тебе так уж нужны - переходи на одну из этих СУБД.

MS SQL Server - напрягает этот M$, ОС зависимая программа.
Oracle я бы может и попробовал, но у хостера только mysql, тогда ставить и на лакальную машину и писать что-то под oracle нет смысла.
Да и вообщем while нужен только для этого случая. Восновном у меня простые запросы.
--------------------
PM MAIL ICQ   Вверх
Bikutoru
Дата 23.7.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата
Я конечно пробовал манипулировать ещё и с ником, но ничего не вышло.
Может есть какие-нибудь идеи... А то я всё тыкал и тыкал, но решения в этоге и не получил.

Видно плохо манипулировал...
Код

SET @user_position = 0; 
SET @flag = 0;

--Выборка позиции юзера с ником "лол"
SELECT
    nick,     -- для теста
    today,  -- для теста
    @user_position :=@user_position + IF(@flag !=1, 1, 0),
    @flag := IF(@flag = 0, IF(nick="лол", 1, 0), 1)
FROM 
    users 
ORDER BY 
    today DESC;

SELECT @user_position;

Под свой вариант, думаю, перепишешь...

А вообще-то нужно учиться мыслить, ибо именно это должно быть основным качеством программиста, а не умение набивать код и даже не знание языка и библиотек (боюсь, сейчас в меня полетят порченные овощи и фрукты).

Цитата
Как бы было всё просто, если бы был while

А SELECT ... FROM ..., по сути дела, тот же while (точнее foreach, но с большими возможностями) и есть.

Цитата
MS SQL Server - напрягает этот M$, ОС зависимая программа.

Зато какие там возможности smile


Цитата
Oracle я бы может и попробовал, но у хостера только mysql

Oracle для простых смертных не дают smile Да и для маленьких баз с простыми запросами это всё равно, что по воробьям из пушки...

Это сообщение отредактировал(а) Bikutoru - 23.7.2005, 12:07


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
fuckerok
Дата 24.7.2005, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Bikutoru
Вроде работает. Спасибо.
Цитата

А вообще-то нужно учиться мыслить, ибо именно это должно быть основным качеством программиста, а не умение набивать код и даже не знание языка и библиотек (боюсь, сейчас в меня полетят порченные овощи и фрукты).

Ну я то смог осмыслить как решать эту проблему, но из-за поскудного знания sql я решить её без помощи не смог.
С меня плюсы. smile
--------------------
PM MAIL ICQ   Вверх
Bikutoru
Дата 24.7.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата
С меня плюсы.

Ловлю на слове smile

А SQL учи - полезная вещь.

Это сообщение отредактировал(а) Bikutoru - 24.7.2005, 10:26


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
fuckerok
Дата 25.7.2005, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 30.3.2004
Где: спб

Репутация: нет
Всего: нет



Вот тока щас сто сообщений набралось
Bikutoru ++ smile
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.