Проблем с MySQL заявка.

vik96

Registered
Здравейте.
Имам таблица files & друга таблица versions.
В files се записва името ,кога и откога е добавен "фаила" и т.н. А във Versions се записват версиите като целта на моята заявка е да изведе за всеки фаил: Име,създател,дата и най-актуалната версия.
Създадох заявката ,обаче имам следният проблем: ако няма въобще някаква версия "фаила" не се показва..Та заявката ми е следната:

[sql]SELECT files.id, files.name, files.createdon, files.lastedit ,files.by,versions.value,versions.time as a FROM versions,files
WHERE files.project_id=:id AND versions.time = (SELECT MAX(time) FROM versions WHERE versions.fid=files.id) AND versions.fid = files.id[/sql]

Та просто искам да изведа и файловете които нямат версии :)
 
Като гледам идеята на таблицата, най-вероятно ще имаш доста записи и според мен това ще работи по-бързо ако имаш индекс по fid във versions:

[sql]
SELECT files.id, files.name, files.createdon, files.lastedit ,files.by,
(select versions.value from versions where versions.fid = files.id order by time DESC limit 1) as verValue,
(select versions.time from versions where versions.fid = files.id order by time DESC limit 1) as verTime
FROM files
WHERE files.project_id=:id
[/sql]

Другата алтернатива, към която първоначално се беше насочил е с JOIN, но не с INNER JOIN както си го направил, а с OUTER JOIN:

[sql]
SELECT files.id, files.name, files.createdon, files.lastedit ,files.by, v2.value as verValue, v1.time as verTime
FROM files
left outer join (select fid,max(time) as time from versions group by fid) v1 on v1.fid=files.id
left outer join (select value,fid,max(time) as time from versions group by value,fid) v2 on v2.fid=files.id and v2.time=v1.time
WHERE files.project_id=:id
[/sql]
 

Back
Горе