shevak
29.03.2009 - 00:03
Добрый всем день.
Никак не получается сделать одну фишку.
есть таблицы: аукцион, пользователь и ставки.
Ставки могут быть сгоревшими и нет.
Место ставки определяется путем выстраивания не сгоревших ставок по порядку
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структуру таблиц с описанием полей не хочешь привести и расписать все нормально?
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). Как то так
Спустя 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
Спустя 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теперь понятно... над подумать
Спустя 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 написал(а):
Вау, спасибо огромное, заработало!!!!