当第一个 select 查询 returns 0 时从第二个 select 查询获取结果
Get result from second select query when first select query returns 0
我有以下架构
CREATE TABLE BookImage (Id UNSIGNED BIG INT, ImageId UNSIGNED BIG INT, IsDefault INT,
PRIMARY KEY(Id, ImageId));
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,10,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,11,1);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,12,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,20,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,21,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,22,0);
我的目标是获得一个 SELECT 查询来查找给定 "Id" 的 (ImageId, Id) 这样 -
- 如果 IsDefault=1,则 return 行
- 如果 IsDefault=0,则 return 最低 ImageId 的行
对于给定的 table,如果我使用 Id=1 查询,它应该 return 只有 (11,1)
如果我使用 Id=2 查询,它应该 return 只有 (20,2) 因为没有 IsDefault=1 for Id=2.
我需要一个 sqlite select 查询来实现它。我已经尝试过此 post 的查询,但它不起作用
SELECT *
FROM BookImage
WHERE Id=1 AND IsDefault=1
UNION ALL
SELECT *
FROM BookImage
WHERE Id=1 ORDER BY ImageId ASC LIMIT 1 AND NOT EXISTS (
SELECT *
FROM BookImage
WHERE Id=1 AND IsDefault=1 LIMIT 1
)
具有ROW_NUMBER()
window功能:
SELECT Id, ImageId
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Id ORDER BY IsDefault DESC, ImageId) rn
FROM BookImage
) b
WHERE rn = 1 AND Id = ?
将 ?
替换为您要搜索的 Id
。
参见 demo.
另一种方式:
SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY ROW_NUMBER() OVER (ORDER BY IsDefault DESC, ImageId)
LIMIT 1
参见demo。
对于不支持 window 函数的旧版 SQLite:
SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY IsDefault DESC, ImageId
LIMIT 1;
参见demo。
Id = 1
的结果:
| Id | ImageId |
| --- | ------- |
| 1 | 11 |
Id = 2
的结果:
| Id | ImageId |
| --- | ------- |
| 2 | 20 |
我有以下架构
CREATE TABLE BookImage (Id UNSIGNED BIG INT, ImageId UNSIGNED BIG INT, IsDefault INT,
PRIMARY KEY(Id, ImageId));
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,10,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,11,1);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,12,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,20,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,21,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,22,0);
我的目标是获得一个 SELECT 查询来查找给定 "Id" 的 (ImageId, Id) 这样 -
- 如果 IsDefault=1,则 return 行
- 如果 IsDefault=0,则 return 最低 ImageId 的行
对于给定的 table,如果我使用 Id=1 查询,它应该 return 只有 (11,1) 如果我使用 Id=2 查询,它应该 return 只有 (20,2) 因为没有 IsDefault=1 for Id=2.
我需要一个 sqlite select 查询来实现它。我已经尝试过此 post 的查询,但它不起作用
SELECT *
FROM BookImage
WHERE Id=1 AND IsDefault=1
UNION ALL
SELECT *
FROM BookImage
WHERE Id=1 ORDER BY ImageId ASC LIMIT 1 AND NOT EXISTS (
SELECT *
FROM BookImage
WHERE Id=1 AND IsDefault=1 LIMIT 1
)
具有ROW_NUMBER()
window功能:
SELECT Id, ImageId
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Id ORDER BY IsDefault DESC, ImageId) rn
FROM BookImage
) b
WHERE rn = 1 AND Id = ?
将 ?
替换为您要搜索的 Id
。
参见 demo.
另一种方式:
SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY ROW_NUMBER() OVER (ORDER BY IsDefault DESC, ImageId)
LIMIT 1
参见demo。
对于不支持 window 函数的旧版 SQLite:
SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY IsDefault DESC, ImageId
LIMIT 1;
参见demo。
Id = 1
的结果:
| Id | ImageId |
| --- | ------- |
| 1 | 11 |
Id = 2
的结果:
| Id | ImageId |
| --- | ------- |
| 2 | 20 |