Хитрый запрос

PartizaneN

I speak PHP
Хитрый запрос

Задача следующая:

нужно выбрать только те айдишники (неуникальные) из таблицы, у которых именно в последней записи будет поле status=complete....

Т.е.

PHP:
------------------------
id | status    | date
-------------------------
2 | abort      | здесь timestamp
3 | complete|
1 | complete|
2 | complete|
1 | abort      |
Именно скюэлем нужно
 

zerkms

TDD infected
Команда форума
[sql]
SELECT * FROM `t` `outer` WHERE EXISTS ( SELECT MAX(`date`) AS `d` FROM `t` `inner` WHERE `inner`.`id` = `outer`.`id` GROUP BY `id` HAVING `d` = `outer`.`date` ) AND `status` = 'complete'
[/sql]
 

PartizaneN

I speak PHP
Черт... Дело в том - что этот нуждаемый запрос итак является подзапросом...

Нужно выбрать всё из таблицы contract, где в последняя сессия была = complete...

Т.е. я предполагал сделать это приблизительно так...

PHP:
SELECT *
FROM  contract
WHERE ID 
IN
(SELECT ContractId 
FROM session ,,,,,,)
А здесь получается аж 2 подзапроса... База весьма объёмная и её видимо это прибьёт сразуже...

Возможнен ли какой-нибудь ещё вариант?
 

zerkms

TDD infected
Команда форума
PartizaneN
выполни мой запрос - он как раз выбирает все данные из таблицы, для которых последняя сессия = complete
 

PartizaneN

I speak PHP
Автор оригинала: zerkms
PartizaneN
выполни мой запрос - он как раз выбирает все данные из таблицы, для которых последняя сессия = complete
Спасибо огромное, сразу видно есть ещё чему мне учиться :)

-~{}~ 10.04.06 16:36:

----------------------------------------------
Итак, решение zerkms(а) хоть и работало правильно - но до ужаса тормозило. 35 секунд по моей базе такой запрос занимал...

Было сделано следующее:
[SQL]CREATE TEMPORARY TABLE session_temp_table SELECT IDcontract, MAX(date) as date FROM session group by IDcontract[/SQL]
и затем
[SQL]
Select * from contract where t1.ID in (SELECT s.IDcontract FROM `session` s, `session_temp_table` t where s.IDcontract=t.IDcontract and s.datumstart=t.datumstart and s.status like '$value')
[/SQL]
 

zerkms

TDD infected
Команда форума
PartizaneN
хм.... если ты и делаешь выборку в темпорари таблицу - то вообще исключи вложенные запросы
делай INNER JOIN, думаю что оно будет ещё более производительным
 
Сверху