1

我有 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相当陌生,也许我没有以正确的方式接近这个?

4

2 回答 2

3

您的问题在这里,在您的子查询中:

(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
于 2013-08-28T07:46:54.460 回答
1

我假设您想要一个包含最新文件的项目列表以及创建它的用户:

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
于 2013-08-28T07:46:05.980 回答