如何获取组中最大记录的密钥?

时间:2013-08-12 10:08:56

标签: sql sqlite

我的数据库中有两个表,一个包含文件名,另一个包含其中描述的信息记录,包括部分的大小。它可以描述为:

表1:id为整数,name为varchar

表2:recid为整数主键,file_id为整数,得分为float

在表之间有一对多的链接,从Table1.id到table2.file_id。我需要的是每个名称与特定模式匹配的文件都会检索链接记录的ID以及最高分和分数本身。 到目前为止我用过:

SELECT name,MAX(score)
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.file_id=Table1.id
WHERE name LIKE :pattern
GROUP BY name

但是我不能用这种方式检索Table2中记录的id。

我使用的方言是Sqlite。

应该使用什么查询来检索每个文件具有最高分数的记录上的数据?

更新

通过这个查询,我接近我想要的东西:

SELECT name,score,recid
FROM Table1
LEFT OUTER JOIN Table2 ON file_id=id 
WHERE name LIKE :pattern
GROUP BY name 
HAVING score=MAX(score)

但是,这会省去第一个表中第二个表中没有相应条目的条目。我怎样才能确保他们最终的结果呢?我应该使用UNION,如果是的话 - 如何使用?

3 个答案:

答案 0 :(得分:3)

使用@billkarwin here描述的出色简单技术,实际上可以在没有GROUP BY的情况下实现:

SELECT name, t2.score
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t2.file_id = t1.id
LEFT OUTER JOIN Table2 t2copy ON t2copy.file_id = t2.file_id
                             AND t2.score < t2copy.score
WHERE name LIKE :pattern
  AND t2copy.score IS NULL

请参阅SQL Fiddle demo

答案 1 :(得分:1)

我认为你必须使用子查询

SELECT name, recid, score
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.file_id=Table1.id
WHERE name LIKE :pattern AND score = (SELECT MAX(score) FROM Table2.score)

答案 2 :(得分:0)

我认为最简单的方法是使用相关的子查询:

SELECT name, recid, score
FROM Table1 LEFT OUTER JOIN
     Table2
     ON Table2.file_id=Table1.id
WHERE name LIKE :pattern AND
      score = (SELECT MAX(t2.score)
               FROM Table1 t1 LEFT OUTER JOIN
                    Table2 t2 
                    ON t2.file_id=t1.id
               where t1.name = table1.name
              );

请注意,您需要表别名来区分内部查询中的表和外部查询。我猜测列实际来自哪些表。