我的桌子是这样的:
瓷砖
Tile
---------------------------------
Id integer not null primary key
测试集
TestSet
--------------------------------
Id integer not null primary key,
TileId integer not null,
CreatedAt datetime not null,
Outcome boolean
Tile和TestSet之间存在1:n的关系。
我想在最近的testSet(由CreatedAt列排序)上获得具有true Result值的testSet的tile。我第一次尝试它并不像我想要的那样工作。
SELECT * FROM Tile
JOIN (SELECT TileId FROM (SELECT * FROM TestSet
WHERE tileId == 'Tile1'
ORDER BY __createdAt DESC
LIMIT 1)
WHERE Outcome=1) as ts ON ts.TileId == Tile.id;
上述语句的问题是最内层SELECT语句中的WHERE子句是硬编码的。
以下是我打破这个过程的方式:
- 抓住最新的testSet。
- 仅从该testSet中选择tileId列。
- 在上述语句中加入tile表以获取所有tile的列表。
醇>
我觉得我正在考虑这个错误的方式而且我真的不应该加入。但是我没有足够的SQL经验来确切地知道如何解决这个问题。我在移动应用程序中专门使用SQLite,那么是否有任何SQLite语句可以帮助我获得正确的瓦片组?
答案 0 :(得分:1)
这是另一种方法。由于tileid已经存在于TestSet中,因此该示例仅使用TestSet,但您可以随意使用Tile表加入它。
select *
from testset t1
where createdat in
(
-- search the same table for the tileid and also ensure outcome is 1
-- sort it by createAt latest to oldest date and choose only the first
-- record
select createdat
from testset t2
where
t2.tileid = t1.tileid
and outcome = 1
order by t2.createdat desc
limit 1
);
答案 1 :(得分:0)
SELECT Id FROM Tile
JOIN (SELECT TileId, Outcome, MAX(CreatedAt)
FROM TestSet
GROUP BY TileId, Outcome
) AS ts
ON ts.TileId == Tile.id
WHERE Outcome = 1;