我有3个表:用户,项目和文件。以下是相关栏目:
users: [userid](int)
projects: [userid](int) [projectid](int) [modified](datetime)
files: [userid](int) [projectid](int) [fileid](int) [filecreated](datetime)
我正在使用查询列出所有项目,但我还希望包含另一个表中的最新文件。我的方法是使用子查询加入。
这是我想出的,但我的问题是它返回了最旧的文件:
SELECT * FROM projects
INNER JOIN users ON projects.userid = users.userid
JOIN (SELECT filename,projectid FROM files
GROUP BY files.projectid
ORDER BY filecreated DESC) AS f
ON projects.projectid = f.projectid
ORDER BY modified DESC
我认为ORDER BY filecreated DESC会解决这个问题,但似乎完全被忽略了。
我对SQL很新,也许我没有以正确的方式接近这个?
答案 0 :(得分:0)
我假设你想要一个包含最新文件的项目列表和创建它的用户:
SELECT projects.projectid, f.username, f.filename, f.filecreated
FROM projects
LEFT OUTER JOIN (
SELECT TOP 1 username, filename, filecreated
FROM files
INNER JOIN users ON users.userid = files.userid
ORDER BY filecreated DESC
) AS f ON projects.projectid = f.projectid
ORDER BY modified DESC
答案 1 :(得分:0)
你的问题出在你的子查询中:
(SELECT filename,projectid FROM files
GROUP BY files.projectid
ORDER BY filecreated DESC) AS f
因为你正在使用那种混合分组和非分组列,我假设你正在使用MySQL。请记住,ORDER BY
子句在应用GROUP BY
子句后将具有无效 - 您不能依赖于MySQL允许这样的语法这一事实(通常,在普通SQL中这是根本不正确的查询。)
要解决此问题,您需要在子查询中获取正确形成的记录。这可以做到,例如:
SELECT
files.filename,
files.projectid
FROM
(SELECT
MAX(filecreated) AS max_date,
projectid
FROM
files
GROUP BY
projectid) AS files_dates
LEFT JOIN
files
ON files_dates.max_date=files.filecreated AND files_dates.projectid=files.projectid