如何根据另一个表中的COUNT(*)选择项目? - SQLite

时间:2015-05-24 01:39:30

标签: sql sqlite

我的桌子是这样的:

瓷砖

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子句是硬编码的。

以下是我打破这个过程的方式:

  
      
  1. 抓住最新的testSet。
  2.   
  3. 仅从该testSet中选择tileId列。
  4.   
  5. 在上述语句中加入tile表以获取所有tile的列表。
  6.   

我觉得我正在考虑这个错误的方式而且我真的不应该加入。但是我没有足够的SQL经验来确切地知道如何解决这个问题。我在移动应用程序中专门使用SQLite,那么是否有任何SQLite语句可以帮助我获得正确的瓦片组?

2 个答案:

答案 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
);

示例:http://sqlfiddle.com/#!7/91548/3

答案 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;