Нужна помощь с запросом

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нужна помощь с запросом

Привет всем
Пришел за советом по MySQL.
Суть проблемы в двух словах...
Есть две таблицы для хранения информации о типах рекламы. Пусть одна таблица t1 другая t2.
Структура таблицы t1:

PHP:
|ID| NAME |
| 1|test1 |
| 2|test2 |
...
| n|test_n |
где ID - автоинкремент, а NAME простой varchar с длинной в 100 символов, хранит названия типов рекламы.

t2:

PHP:
|ID|ADV_ID|DATE|PRICE|
|1 |  1   |....| 120 |
|2 |  2   |....| 150 |
|3 |  1   |....| 200 |
...
|n |  m   |....| z   |
где ID- автоинкремент,
ADV_ID - поле, связывающее t1 и t2 (t1.ID=t2.ADV_ID),
DATE - поле типа DATE, хранящее дату, когда внесли новую цену рекламы,
PRICE - поле FLOAT типа с инфой о цене того или иного типа рекламы.

Суть проблемы: необходимо выбрать наиболее свежую информацию об активных типах рекламы, с наибольшим t2.ID и сгруппированное по t2.ADV_ID.

Не присоединяя инфу из t1 через JOIN к t2, то есть попытавшись написать запрос только к t2 чтобы выбрать данные, я получил следующий запрос:
PHP:
SELECT *
FROM t2
GROUP BY ADV_ID
ORDER BY ID DESC
Запрос вернул ряды с данными:
PHP:
|ID|ADV_ID|PRICE|
|2 | 2    | 150 |
|1 | 1    | 120 |
А нужно:

PHP:
|ID|ADV_ID|PRICE|
|3 | 1    | 200 |
|2 | 2    | 150 |
Как вывести данные, сгруппировав их по ADV_ID с наибольшим автоинкрементным ID?
Спасибо за внимание.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
База версии 4.1.хх. К сожалению имеем http://bugs.mysql.com/bug.php?id=5451 =(

Суть была в группировке значений начиная с наибольшего.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
каким образом подзапрос группирует значения от максимального значения n колонки? я вижу только что он выбирает из первой таблицы все записи которые имеют максимум во второй. у меня не такая задача немножко.

Статус может и not a bug однако группировка не рабоает как ожидается.

Проблема была решена средствами php, запрос я оставил пока в покое.
 

alpine

Новичок
c0dex
каким образом подзапрос группирует значения от максимального значения n колонки?
Ниче не понял. Как запрос может что-то группировать от максимального значения?!
я вижу только что он выбирает из первой таблицы все записи которые имеют максимум во второй.
Он выбирает все записи из первой таблицы которые имеют максимальные значение для группы в этой же первой таблице.
у меня не такая задача немножко.
Место того чтобы написать что конкретно не так, ты считаешь что, я должен проявить смекалку и догадаться об этом.
Статус может и not a bug однако группировка не рабоает как ожидается.
Она и не должна работать, как ты ожидаешь. Более того во взрослых БД такой запрос будет генерить ошибку.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
alpine, перечитай первый пост. Я там вроде бы ясно обяснил что мне нужно получить из БД и что я получаю вместо этого. Мне нужно получить значения сгруппированные оператором GROUP.
 

alpine

Новичок
c0dex
Мне нужно получить значения сгруппированные оператором GROUP.
Почему именно GROUP BY и никак больше?! Ты спользуешь агрегатные функции в запросе? Если да то в первом посте ничего про это не написано, если нет то этот групп бай тебе рогом уперся что ли?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Как таковых агрегирующих в запросе нет. Сам оператор GROUP используется для получения данных, в которых не будет дублирующих позиций в определенном столбце.
Не уперся он мне, я бы с удовольствием сделал запрос и без него.
 

alpine

Новичок
Сам оператор GROUP используется для получения данных, в которых не будет дублирующих позиций в определенном столбце.
Тоесть ты хочешь сказать что в таком запросе с уникальным автоинкрементным ID ты получишь дублирующиеся записи?!
[sql]
SELECT * FROM `table` as t1 WHERE t2.id=(SELECT MAX(t2.id) FROM `table` as t2 WHERE t1.adv_id=t2.adv_id) ORDER BY t1.id DESC
[/sql]
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
C таким запросом я ничего не получил потому что он ошибку выплюнул, а такой вернул что надо:

SELECT *
FROM `table` AS t1
WHERE t1.id = (
SELECT MAX( t2.id )
FROM `table` AS t2
WHERE t1.adv_id = t2.adv_id )
ORDER BY t1.id DESC

Спасибки.
 

alpine

Новичок
c0dex
Пожалуйста. Ппц тривиальную задачу на целой странице решали ... :D
 
Сверху