SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.04.2011 18:30:40

Vladislavik
Участник
Зарегистрирован: 11.12.2009
Сообщений: 4

Список, с объединением, нужна последняя запись объединения.

Добрый день, гуру.

Есть таблица

title_id  title               time        available   deleted  complaint
1         Танк                7              1           0           1
3         Машина            8              1           0           1
1         Танк                9              1           0           1
2         Пушка            10              1           0           1

Есть запрос,

SELECT * from tablename WHERE available=1 AND deleted=0 AND complaint=1 GROUP BY title_id DESC ORDER BY time DESC


который выводит последние добавленные записи, при этом объединяя записи с одинаковым "title_id". Как сделать, так, что бы при объединении записей с одинаковым "title_id", выводилось последнее добавленное в этом объединении, а не первое.

Тоесть выводит так:

title_id  title               time        available   deleted  complaint
1         Танк                7              1           0           1
3         Машина            8              1           0           1
2         Пушка            10              1           0           1

Нужно так:

title_id  title               time        available   deleted  complaint
3         Машина           8               1           0           1
1         Танк               9               1           0           1
2         Пушка           10               1           0           1

Самое, что интересное, если из запроса исключить
AND deleted=0
, то функция работает так, как мне надо....

Индексы: title_id, deleted,

Отредактированно Vladislavik (21.04.2011 18:33:21)

Неактивен

 

#2 21.04.2011 21:59:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Список, с объединением, нужна последняя запись объединения.

К сожалению, хорошего способа нет. Можно, например, так:

SELECT t.* FROM tablename t
JOIN (SELECT title_id, MAX(time) AS time FROM tablename GROUP BY 1) s ON
  t.title_id = s.title_id AND t.time = s.time.

Неактивен

 

#3 22.04.2011 00:20:06

Vladislavik
Участник
Зарегистрирован: 11.12.2009
Сообщений: 4

Re: Список, с объединением, нужна последняя запись объединения.

Спасибо, немного тормознуто, но работает))

Неактивен

 

#4 22.04.2011 00:36:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Список, с объединением, нужна последняя запись объединения.

Vladislavik написал:

SELECT * from tablename WHERE available=1 AND deleted=0 AND complaint=1 GROUP BY title_id DESC ORDER BY time DESC

group by подразумевает "сжатие" по определенному критерию (сумма, максимальное значение и пр), поэтому такая форма запроса, вообще говоря, некорректна.

Vladislavik написал:

Спасибо, немного тормознуто, но работает))

Добавьте индексы на поле time и на пару (title_id,time).

Отредактированно deadka (22.04.2011 10:05:18)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 23.04.2011 18:23:36

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Список, с объединением, нужна последняя запись объединения.

Можно еще так:

set @i=0, @p=0; select srt.* from ( select * from t_4157 order by `title_id`, `time` desc) as srt where ( (if (@p=title_id, @i:=@i+1,(@i:=0) or (@p:=title_id))) and @i<1);


То есть отсортировать по title_id, в его рамках отсортировать по time по убыванию, и далее отсеять все те записи, в которых повторяется title_id.

Тоже не слишком хорошо, но работать будет.

Отредактированно deadka (23.04.2011 18:25:28)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 26.05.2011 22:40:22

Vladislavik
Участник
Зарегистрирован: 11.12.2009
Сообщений: 4

Re: Список, с объединением, нужна последняя запись объединения.

В таблице 18 000 строк.
Сделал вот такой запрос:

SELECT t.id FROM items t JOIN (SELECT title_id, MAX(addtime) AS addtime FROM items  WHERE available = '1' AND deleted = '0' AND complaint_accept = '0' GROUP BY  1) s ON t.title_id = s.title_id AND t.addtime = s.addtime  ORDER BY edittime DESC  LIMIT 0,1000;


В mysql-slow.log показывает, что данный запрос выполняется долго, и ищет по всей базе, Rows_examined: 36000.

Индексы:
deleted, addtime, title_id, edittime
есть еще составные
available_deleted_complaint_accept и title_id_addtime, title_id_edittime
.

Подскажите, какие индексы убрать, какие оставить, или может другие сделать, что-бы сайт не тормозил... Чет с индексами я не понимаю)

Отредактированно Vladislavik (26.05.2011 23:17:21)

Неактивен

 

#7 27.05.2011 12:25:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Список, с объединением, нужна последняя запись объединения.

available_deleted_complaint_accept_title_id_addtime
title_id_addtime_edittime

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson