Выбор последнего id при использовании GROUP BY

Vivek

Guest
Выбор последнего id при использовании GROUP BY

Здраствуйте.
Возник малений вопросик.
Есть 2 таблицы:
Таблица категорий(t2)
gid
name

Таблица элементов(t1)
id
gid
{...}

Есть запрос:
SELECT t1.id, t2.gid, t2.name, {...}, count(t1.gid) FROM t1, t2 WHERE t1.gid=t2.gid GROUP BY t1.gid ORDER BY t2.name ASC LIMIT 0, 10

Хотелось бы чтобы t1.id выбиралсь в обратном порядке, т.е. последние добавленые, а не те которые первыми были добавлены в категорию. Можно сделать добавив в t2 поле last_id, а потом через LEFT JOIN присоединять. Но тут возникает необходисость обновления каждый раз поля t2.last_id. Поэтому хотелось бы слелать без этого...

Заренее спасибо : )
 

Vivek

Guest
Пробовал. Запрос
SELECT t1.id, t2.gid, t2.name, {...}, count(t1.gid) FROM t1, t2 WHERE t1.gid=t2.gid GROUP BY t1.gid ORDER BY t1.id DESC
Сначало делает group, а потом сортирует (t1.id получаются первые добавленые в таблицу). Но как бы это не то, надо что бы он перевернул таблицу t1.id DESC а потом сгрупперовал

Надо, что то вроди этого
SELECT t3.id, t1.gid, t2.name, {...}, count(t1.gid)FROM t1, t2 LEFT JOIN t3 ON t3.id=t2.last_id WHERE t1.gid=t2.gid GROUP BY t1.gid ORDER BY t3.id DESC
Только без добавления поля t2.last_id. (t3 это таже таблицу что и t1)
 

basboy

Новичок
Ты писал, что тебе нужно выводить"последние добавленые".

Секрет в том, что последние добавленные выводятся в запросе вервыми. так что тебе не нужна сортировка. Выкидывай из запроса ORDER BY
 

chira

Новичок
Vivek
очень туманно описано, но попробуй:
Код:
SELECT MAX(t1.id) t1_id, t2.gid, t2.name, count(t1.gid) 
FROM t1, t2 
WHERE t1.gid=t2.gid 
GROUP BY t1.gid 
ORDER BY 1 DESC
 

Vivek

Guest
chira: Практически только маленько но. Счас попробую подробнее расписать, что мене вообще надо :)
Таблица:
t2 {gid;name}
1,name1;
2,name2;
t1 {id;gid;title;content}
1,1,title1,content1
2,2,title2,content2
3,1,title3,content3

нужен запрос который бы выдал
1. все категории (t2.gid, t2.name)
2. количество записей в этих категориях (count(t1.gid))
3. последнюю запись это в эту категорию (т.е. обновление) (t1.id, t1.title, t1.content)
SELECT t2.gid, t2.name, count(t1.gid), t1.id, t1.title, t1.content

если сделать
SELECT t2.gid, t2.name, count(t1.gid), t1.id, t1.title, t1.content FROM t1, t2 WHERE t1.gid=t2.gid GROUP BY t1.gid ORDER BY t2.id ASC
то выдается
1, name1, 2, 1, title1, content1
2, name2, 1, 2, title2, content2
А необходимо что бы выдавался
1, name1, 2, 3, title3, content3
2, name2, 1, 2, title2, content2
если t1.id заменить MAX(t1.id), то id получим правильный, но вот 2 посдених поля останутся без изменений :(
1, name1, 2, 3, title1, content1
2, name2, 1, 2, title2, content2

P.S. сорри что сразу криво описал...
 

basboy

Новичок
Vivek

В запросе пиши last(t1.title) или first(t1.title) для первого и последнего

-~{}~ 04.11.05 13:11:

ИЗВИНЯЮСЬ...

last(t1.title) и first(t1.title) в MySQL не работают. В Access только.
 

chira

Новичок
на сайте MySQL был похожий пример:
Код:
SELECT t2.gid, t2.name, count(t1.gid)
, MAX(t1.id)
, substring(MAX(concat(lpad(t1.id,10,'0'),t1.title)),11) t1_title
, substring(MAX(concat(lpad(t1.id,10,'0'),t1.content)),11) t1_content
FROM t1, t2 
WHERE t1.gid=t2.gid 
GROUP BY t1.gid 
ORDER BY t2.id ASC
 

basboy

Новичок
Искал в мане, так и не нашёл эквивалентных аксесовским функций. Ещё раз сорри на оффтоп.
 

Vivek

Guest
chira: видемо прогляде я этот пример.

Всем кто помогал Баг Санькс :) все заработало.
 
Сверху