用于选择不同数据的高级 SQL 查询

Posted

技术标签:

【中文标题】用于选择不同数据的高级 SQL 查询【英文标题】:Advanced SQL query to select distinct data 【发布时间】:2013-04-23 15:10:27 【问题描述】:

我有两个表需要从中提取数据。 表1(t1)及样本值:

| rq_id | user_id | is_good |  
|----- 1     |---- 223     |--------      0  ----   |  
|----- 3     |---- 223     |--------      1   ----  |  
|----- 4     |---- 239     |--------      0   ----  |  
|----- 5     |---- 223     |--------      0   ----  |

Table2(t2)和样本值:

| rq_id | version | random_content |  
|---1---|---3------|------A------|    
|---1---|---2------|------B------|    
|---1---|---1------|------C------|  
|---3---|---2------|------D------|  
|---3---|---1------|------F------|  
|---5---|---2------|------X------|  
|---5---|---1------|------W------|  

table1中rq_id是唯一的,table2中有多行rq_id相同。 我需要从 Table2 中为每个 rq_id 获取 1 行(只有最高版本的行)。从 Table2 中选择 request_ids 的标准将来自 Table1,其中 user_id=223 和 is_good="0"。 所以在这种情况下,我希望它返回:|---1---|---3------|------A------||---5---|---2------|------X------|

这可以在一个快速的 SQL 查询中完成吗?有一些关节和不同的选择/内部选择或其他任何东西?

【问题讨论】:

【参考方案1】:
SELECT  b.*
FROM    Table1 a
        INNER JOIN Table2 b
            ON a.rq_ID = b.rq_ID
        INNER JOIN
        (
            SELECT  rq_id, MAX(version) max_ver
            FROM    table2
            GROUP   BY rq_id
        ) c ON  b.rq_ID = c.rq_ID AND
                b.version = c.max_ver
WHERE   a.user_ID = 223 AND a.is_good = 0
SQLFiddle Demo

【讨论】:

以上是关于用于选择不同数据的高级 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL高级子选择查询

高级查询 - 选择,按条件求和并返回累加值

SQL笔记--MySQL高级操作

高级 SQL 选择查询

SQL高级查询

浅谈 T-SQL高级查询