[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: аукцион, место ставок в рейтинге
shevak
Добрый всем день.
Никак не получается сделать одну фишку.

есть таблицы: аукцион, пользователь и ставки.
Ставки могут быть сгоревшими и нет.
Место ставки определяется путем выстраивания не сгоревших ставок по порядку

SQL
SELECT r.*, u.login FROM rates as r LEFT JOIN users as u ON u.id=r.user_id WHERE r.auction_id=$auction_id ORDER BY status,sum DESC


Все хорошо и замечательно. Только теперь надо бы вытащить ставки пользователя, а также места этих ставок в общем списке.

До этого такая задача стояла для единичной ставки. Удалось решить следующим способом:
SQL
SET @n:=0, @found:=0;
SELECT IF(@found = 1 OR id=".$lastId.", @found:=1, @n:=@n+1) FROM rates WHERE auction_id=$auction_id AND status=1 ORDER BY sum DESC SELECT @n AS num

Был даже от кого-то совет - посчитать сумму элементов до заданного и прибавить 1. Но это опять же место одной ставки

Подумывал еще добавить параметр места ставки в БД. но понятно, что это бессмысленно, т.к. при добавлении одной ставки придется переписывать все предыдущие.

Подскажите плиз, что тут мона придумать



Спустя 10 часов, 35 минут, 40 секунд (29.03.2009 - 08:38) Sylex написал(а):
shevak
структуру таблиц с описанием полей не хочешь привести и расписать все нормально? wink.gif

reproduce case - 2

Спустя 5 часов, 27 минут, 24 секунды (29.03.2009 - 14:06) shevak написал(а):
таблица auctions:
- id
- name
- description

users:
- id
- name
- login

rates (ставки):
- id
- auction_id
- user_id
- rate
- status

Надо выбрать из таблицы rates записи с заданным auction_id, user_id. При этом в выборке необходимо поле с местом порядковым номером записи в выборке по условию auction_id (без user_id). Как то так sad.gif

Спустя 40 минут, 49 секунд (29.03.2009 - 14:46) Sylex написал(а):
Цитата ("shevak")
Место ставки определяется путем выстраивания не сгоревших ставок по порядку


можешь понаглядней, ЧТО ТАКОЕ МЕСТО СТАВКИ?

Число? Идентификатор записи - первой несгоревшей?

Т.е. к примеру для аукциона с id = 6 есть 15 ставок...

из них 4 сгорели - status=1, так? Остальные 11 - status = 0.

И какое тогда место ставки будет? 5? Или ид записи первой, у которой status = 0?

если типа так - то задача легкая

Спустя 2 часа, 1 минута, 3 секунды (29.03.2009 - 16:47) shevak написал(а):
к примеру, такой набор данных (аукцион=5 статус=0):

№п/п аукцион пользователь ставка статус
1 5 4 99 0
2 5 4 98 0
3 5 3 97 0
4 5 4 96 0
5 5 3 95 0
6 5 4 94 0

Надо сделать выборку с учетом пользователя, что получилось такое:

№п/п аукцион пользователь ставка статус
3 5 3 97 0
5 5 3 95 0

№ п/п должен как-то сохраниться с первого запроса. Я ж не буду выбирать все записи и выводить на экран только с нужным пользователем. Лишние данные с БД тянуть. Т.к. ставок может быть 1000, а у пользователя - 2-3.

Спустя 47 минут, 40 секунд (29.03.2009 - 17:35) Sylex написал(а):
SQL
SELECT r.id, r.*, u.login FROM rates as r INNER JOIN users as u ON u.id=r.user_id WHERE r.auction_id=$auction_id AND u.userid = $user_id ORDER BY status,sum DESC


??

r.id - это и есть номер по-порядку.. в таблице должен быть PRIMARY KEY id - INT NOT NULL AUTO_INCREMENT smile.gif

Спустя 18 минут (29.03.2009 - 17:53) shevak написал(а):
r.id это PRIMARY KEY id - INT NOT NULL AUTO_INCREMENT. Если б в таблице был номер по порядку, то проблем бы не было.

Спустя 6 минут, 35 секунд (29.03.2009 - 18:00) shevak написал(а):
Что было понятней, приведу еще такой пример:
таблица rates:
id auction_id user_id rate status
1 5 4 99 0
2 5 3 81 0
3 5 4 80 0
4 5 3 97 0
5 5 4 99 1
6 5 4 98 0
7 5 3 99 1
8 5 4 99 1
9 5 4 85 0

После выборки получится такие данные:
№п/п r.id auction_id user_id rate status
1 1 5 4 99 0
2 6 5 4 98 0
3 4 5 3 97 0
4 9 5 4 85 0
5 2 5 3 81 0
6 3 5 4 80 0
№п/п я условно обозвал номер строки в выборке. Это и есть место ставки в рейтинге, привязать его к r.id никак нельзя. Сортируется все по полю rate

Спустя 1 час, 22 минуты, 54 секунды (29.03.2009 - 19:23) Sylex написал(а):
shevak
ой парень ты мудришь)))

ну если это просто номер по порядку, зачем тебе SQL ?

Выводи этот номер в PHP!

Ведь после выборки из БД, ты что получаешь, массив, так? Ну и сделай счетчик-переменную!! В чем проблема то?

PHP
$id 0;
whilte ($row mysql_fetch_array($res))
{
  
$id++;
  
// print data
}

Спустя 12 минут, 16 секунд (29.03.2009 - 19:35) shevak написал(а):
я так и делаю для случая, если мне надо вывести все ставки.

Но как быть если надо вывести ставки пользователя???? для последнего примера для r.id=4 место равно 3. Но если мы делаем выборку с указанием пользователя, то запись будет на первом месте. а надо - на 3-м.

Спустя 10 часов, 34 секунды (30.03.2009 - 05:35) Sylex написал(а):
shevak
теперь понятно... над подумать smile.gif

Спустя 8 дней, 15 часов, 51 минута, 25 секунд (8.04.2009 - 21:27) shevak написал(а):
Никаких предложений не будет? хоть что-то? может как-то БД подправить, чтоб такое выводить возможно было?

Спустя 23 часа, 45 минут, 6 секунд (9.04.2009 - 21:12) Alchemist написал(а):
попробуй так:
SQL
SELECT r1.*, u.login, COUNT(r2.id)+1 as `position`
FROM `rates` as `r1` 
    INNER JOIN `users` as `u` ON (u.id = r1.user_id) 
    LEFT JOIN rates as `r2` ON (r2.sum > r1.sum AND r2.status = 0 AND r2.auction_id = $auction_id)
WHERE r1.status = 0 AND r1.auction_id = $auction_id AND u.id = $user_id
GROUP BY r1.id
ORDER BY r1.status, r1.sum DESC

Спустя 57 минут, 12 секунд (9.04.2009 - 22:09) shevak написал(а):
Вау, спасибо огромное, заработало!!!!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.