SQL 查询 select 最大值,除非来自两个有交集的表不为空
SQL Query select max value unless not null from two tables with intersection
表:
Files
-------------------
id | revision
-------------------
1 | 0
1 | 1
1 | 2
2 | 0
2 | 1
Folders
-----------------
id | name
-----------------
1 | FooBar
Shares
--------------------------------
id | folderId | fileId | fileRev
--------------------------------
1 | 1 | 1 | null
2 | 1 | 2 | 0
我期望的输出:
fileId | revision
------------------
1 | 2
2 | 0
我希望能够获取基于 Shares table 的信息,如果文件修订为 NULL,return 具有最高修订的该文件的记录。如果 fileRev 不为空,return 与该修订对应的文件记录。
我已经能够像这样复制它了:
SELECT f.id, max(f.rev) as rev
FROM files f
INNER JOIN shares s ON s.fileId = f.id
WHERE s.fileRev IS NULL AND s.folderId = 1
GROUP BY f.id
UNION
SELECT f.id, f.rev as rev
FROM files f
INNER JOIN shares s ON s.fileId = f.id AND f.rev = s.fileRev
WHERE s.fileRev IS NOT NULL AND s.folderId = 1
如何使用更优化的查询来执行此操作?可能没有工会?
我认为这应该可行,但在没有可用数据库的情况下很难测试。
IFNULL returns 或者 shares.fileRev 如果它不为空,如果它是 returns files.rev
SELECT files.id,
MAX(IFNULL(shares.fileRev, files.rev)) as rev
FROM files
JOIN shares ON shares.fileId = files.id
WHERE shares.folderId = 1
GROUP BY files.id
表:
Files
-------------------
id | revision
-------------------
1 | 0
1 | 1
1 | 2
2 | 0
2 | 1
Folders
-----------------
id | name
-----------------
1 | FooBar
Shares
--------------------------------
id | folderId | fileId | fileRev
--------------------------------
1 | 1 | 1 | null
2 | 1 | 2 | 0
我期望的输出:
fileId | revision
------------------
1 | 2
2 | 0
我希望能够获取基于 Shares table 的信息,如果文件修订为 NULL,return 具有最高修订的该文件的记录。如果 fileRev 不为空,return 与该修订对应的文件记录。
我已经能够像这样复制它了:
SELECT f.id, max(f.rev) as rev
FROM files f
INNER JOIN shares s ON s.fileId = f.id
WHERE s.fileRev IS NULL AND s.folderId = 1
GROUP BY f.id
UNION
SELECT f.id, f.rev as rev
FROM files f
INNER JOIN shares s ON s.fileId = f.id AND f.rev = s.fileRev
WHERE s.fileRev IS NOT NULL AND s.folderId = 1
如何使用更优化的查询来执行此操作?可能没有工会?
我认为这应该可行,但在没有可用数据库的情况下很难测试。
IFNULL returns 或者 shares.fileRev 如果它不为空,如果它是 returns files.rev
SELECT files.id,
MAX(IFNULL(shares.fileRev, files.rev)) as rev
FROM files
JOIN shares ON shares.fileId = files.id
WHERE shares.folderId = 1
GROUP BY files.id