Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Текущая позиция в запросе
 
 автор: ardolix   (14.03.2008 в 14:37)   письмо автору
 
 

Как можно узнать текущую позицию определеной записи и реализовать возможность поднятия записи вверх остальных?

На многих сайтах есть опции - поднять анкету вверх, поднять вакансию вверх...

Мой вариант: использовать поле position, при инсерте новой записи и поднятия вверх равнять с SELECT COUNT(), потом вычитывать позицию из position - \"SELECT COUNT()\". В случае удаления записей, пересчитывать все position.

Может есть более оптимальные решения?

   
 
 автор: olejek   (14.03.2008 в 15:30)   письмо автору
 
   для: ardolix   (14.03.2008 в 14:37)
 

Предлагаю, как вариант, вместо поля position ввести поле time_pos (например).
По добавлению новой записи в это поле вставлять текущее время.
При "поднятии записи вверх остальных" перезаписывать время.

   
 
 автор: Ardolix   (14.03.2008 в 16:02)   письмо автору
 
   для: olejek   (14.03.2008 в 15:30)
 

Отличная идея для второй части задачи. Однако, остаёться первая - необходимо отобржать (причём очень часто) - текущую позицию (ваша анкета/вакансия занимает ... место).

   
 
 автор: olejek   (14.03.2008 в 16:38)   письмо автору
 
   для: Ardolix   (14.03.2008 в 16:02)
 

Например:
<?
   
/*
            name         time_pos
    Иванов        2008-03-14 15:46:52
    Петров         2008-03-14 15:47:03
    Сидоров     2008-03-14 15:47:23
    Кузнецов     2008-03-14 15:47:32*/

    
$i=1;
    
$query=mysql_query("select * from table order by time_pos") or die (mysql_error());
    while (
$qr mysql_fetch_array($query))
      {
      echo 
$qr['name']." - Ваша позиция - $i";
      
$i++;
      }
?>

   
 
 автор: KirillKiev   (14.03.2008 в 16:40)   письмо автору
 
   для: olejek   (14.03.2008 в 16:38)
 

ну если через скрипт довавьте

$i = 0;
 while ($qr = mysql_fetch_array($query))
      {
      echo $qr['name']." - Ваша позиция - ".$i++;
      $i++;
      } 

   
 
 автор: olejek   (14.03.2008 в 16:43)   письмо автору
 
   для: KirillKiev   (14.03.2008 в 16:40)
 

Ух, ты, KirillKiev! Мы с вами мыслим почти одинаково! Только зачем же два раза $i++?

   
 
 автор: KirillKiev   (14.03.2008 в 16:46)   письмо автору
 
   для: olejek   (14.03.2008 в 16:43)
 

не заметил сори

   
 
 автор: Ardolix   (14.03.2008 в 16:48)   письмо автору
 
   для: olejek   (14.03.2008 в 16:38)
 

В вашем случае, конечно, отличное решение. Дело в том, что оно не отображаеться списком всех пользоаателей, а для каждого в частности. Для этого, пересчитывать при каждом отображении (обычно это на каждой странице, что достаточно часто), дало бы высокую нагрузку.

   
 
 автор: olejek   (14.03.2008 в 16:55)   письмо автору
 
   для: Ardolix   (14.03.2008 в 16:48)
 

Ну, тогда остается тот вариант, который Вы описали сначала. Хотя он какой-то кривой.
Может, кто еще что-нибудь придумает.

   
 
 автор: KirillKiev   (14.03.2008 в 17:04)   письмо автору
 
   для: olejek   (14.03.2008 в 16:55)
 

Хех
тока что обнаружил еще один вариант, правда непроверял в php а напрямую в мускуле
использование переменных мускула
пример

set @x=0;
select
(@x:=@x+1) as n,
`countryId` 
from
`BidsActiv`
group by countryId
having countryId = 4

тогда иду соответствующему в данном случае 4 будет соответствовать номер 3
ну в моей таблице
http://www.weblibrary.biz/mysql/struktura/peremennye

   
 
 автор: Ardolix   (14.03.2008 в 17:23)   письмо автору
 
   для: KirillKiev   (14.03.2008 в 17:04)
 

А если эта миллионая позиция, то как поступить?

   
 
 автор: KirillKiev   (14.03.2008 в 17:32)   письмо автору
 
   для: Ardolix   (14.03.2008 в 17:23)
 

незнаю... что будет в данном случае у меня 150000 строк обрабатывало 4 секунды
не... все таки эта лажа нужно еще искать с нумерацией строк
у меня просто ощущение, что не существует в мускуле нумерации строк вне определенного набора
а набор нужно выполнить весь, что бы получить данную нумерацию
может кто то еще чего посоветует

   
 
 автор: Ardolix   (14.03.2008 в 18:30)   письмо автору
 
   для: KirillKiev   (14.03.2008 в 17:32)
 

4 секунды это очень много.

Просто многие это используют. Навярняка есть оптимальное решение. К примеру loveplanet - 9,634,061 анкет. каждому авторизированому пользователю всегда показывается какую позицию он в поиске занимает. Причём даже и на всём сайте и в городе. Та же фитча и на мамбе и 24open.

   
 
 автор: Ardolix   (17.03.2008 в 02:35)   письмо автору
 
   для: ardolix   (14.03.2008 в 14:37)
 

Спасибо всем!
В первой части задачи использовал идею olejek, а вторую:
SELECT count(*) 
FROM ANKETS a 
WHERE a.anket_type = @USER_ANKET_TYPE a.update_time > @USER_UPDATE_TIME;

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования