我有 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 还很陌生,也许我没有以正确的方式处理这个问题?
最佳答案
你的问题就在这里,在你的子查询中:
(SELECT filename,projectid FROM files
GROUP BY files.projectid
ORDER BY filecreated DESC) AS f
由于您使用的是那种混合分组和非分组列,我假设您正在使用 MySQL。请记住,应用 GROUP BY
子句后,ORDER 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
关于mysql - ORDER BY 在子查询连接中被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481867/