2017-02-16 56 views
0

我的SQL很生疏,我必须解决一个问题。我有三个表中的数据,如下所示。在table1和table2列中,username都是唯一的!MySQL从一个表中选择数据,其中条件在其他表中

我需要列出max(year)= 2016(表3中)且必须是type = 0(来自table2)的所有用户(来自table1)的地址。 根据示例中的数据,结果应为:地址3

任何想法如何使用单个SQL命令执行此操作?我可以(并且我已经完成了)写一个脚本,但它应该是一个(复杂的)SQL命令!

我试过连接,内部连接等,但作为偶尔的SQL用户,我的知识是有限的,至少可以说。

table1    table2   table3   
---------|-------- --------|---- --------|----- 
username |address username|type username| year 
---------|-------- --------|---- --------|----- 
user1 |address1 user1 | 1 user1 | 2015 
user2 |address2 user2 | 1 user1 | 2016 
user3 |address3 user3 | 0 user1 | 2017 
user4 |address4 user4 | 0 user2 | 2015 
            user2 | 2016 
            user3 | 2015 
            user3 | 2016 
            user4 | 2014 
            user4 | 2015 
+0

见http://meta.stackoverflow.com/questions/333952/why-should -i-provide-an-mcve-for-what-seem-to-a-very-simple-sql-query – Strawberry

回答

0
select table1.address 
from table1 
    inner join table2 on table2.username = table1.username 
    inner join 
       (select username, max(date) maxDate 
       from table3 
       group by username) t3 on t3.username = table1.username 
where table2.type = 0 
     and t3.maxDate = 2016; 

select table1.address 
from table1 
    inner join table2 on table2.username = table1.username 
    inner join 
       (select username, max(date) maxDate 
       from table3 
       group by username 
       having max(date) = 2016) t3 on t3.username = table1.username 
where table2.type = 0; 
+0

我们生活在一个多么美好的世界! 仅仅几分钟后,我发布了问题两个答案来了。 @McNets答案(我使用选项2)工程很好,所以我接受这个答案,因为它更清楚一点(虽然我编辑了两个选项的等号),似乎Avidos的答案有一个错字,我没有检查它,但我相信它会起作用! 无论如何都要感谢McNets和Avidos。 – user3560520

+0

看来,我无法编辑接受的答案,因为我张贴(或我不知道如何?!)。为了答案与问题一致,2016年之前的标志应该是=。当然,这很明显! 再次感谢。 – user3560520

0

你可以试试这个,队友:

SELECT 
-- I need to list addresses of all users (from table1) 
    t1.username, t1.address 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t2.username = t1.username 
    INNER JOIN table3 t3 ON t3.username = t2.username 
-- and also must be of type=0 (from table2) 
WHERE t2.type = 0 
-- that have max(year)=2016 
HAVING MAX(t3.year) = 2016; 
+0

非常感谢Avidos。自从我将评论发布到@McNets并接受他的回答后,您似乎已经编辑了您的答案! – user3560520

+0

@ user3560520是的,编辑了几次,以提供我可以在满足您的问题时提供的“最简单”答案。干杯 – Avidos

相关问题