从类似结果中筛选出每组除一个结果之外的所有结果

时间:2012-09-24 02:20:41

标签: mysql sql

所以我有一张表格列出了他们所服务的所有prime_ministersyear以及他们所在的party

我需要3位信息;他们的name,他们的第一个year职位和party在他们的最后一年(一些转换方)。

该表看起来有点像这样

min_nr|pm_name      |party           |yr_comm  
---------------------------------------------- 
1      Barton E      Protectionist    1901  
.  
.  
.  
11     Hughes W M    Labour           1915  
12     Hughes W M    National Labour  1916  
13     Hughes W M    Nationalists     1917  
14     Hughes W M    Nationalists     1918  
.  
.  

我做了很多搜索,但我不知道如何输入这个搜索结果。

吴先生在评论部分做了这件事。事实证明,我不了解多个JOINS以及在ON中正确使用AND。

SELECT a.pm_name, a.party, c.minYear
FROM  Table1 a 
      INNER JOIN
      (
          SELECT pm_name, MAX(yr_comm) maxYear
          FROM table1
          GROUP BY pm_name
      ) b ON a.pm_name = b.pm_name AND
             a.yr_comm = b.maxYear
      INNER JOIN
      (
        SELECT pm_name, MIN(yr_comm) minYear
        FROM table1
        GROUP BY  pm_name
      ) c ON a.pm_name = c.Pm_name

编辑,许多编辑

1 个答案:

答案 0 :(得分:4)

尝试子查询以获得每位总理的最大年份。如果您想获取所有列,则此方法有效。

SELECT a.*
FROM tableName a INNER JOIN
        (
            SELECT ID, MAX(`year`) maxYear
            FROM tableName
            GROUP BY ID
        ) b ON a.ID = b.ID AND
                a.`Year` = b.maxYear

tableName =>将其更改为您的表名称
ID =>将其更改为主键
Year =>将其更改为您年份的列名称。

但如果你只想得到总理的ID,那么他们的最后一年是哪一年。您可以在没有子查询的情况下直接执行此操作。

SELECT ID, MAX(`year`) finalYear
FROM tableName
GROUP BY ID

PS:如果这个答案仍然不明确,请添加表格的模式,样本记录和所需的结果,我们可以继续处理。感谢。

更新1

SELECT a.pm_name, a.party, c.minYear
FROM  Table1 a 
      INNER JOIN
      (
          SELECT pm_name, MAX(yr_comm) maxYear
          FROM table1
          GROUP BY pm_name
      ) b ON a.pm_name = b.pm_name AND
             a.yr_comm = b.maxYear
      INNER JOIN
      (
        SELECT pm_name, MIN(yr_comm) minYear
        FROM table1
        GROUP BY  pm_name
      ) c ON a.pm_name = c.Pm_name

SQLFiddle Demo