【问题标题】:MySQL select data from one table where conditions are in other tablesMySQL从一个表中选择条件在其他表中的数据
【发布时间】:2017-02-16 23:44:22
【问题描述】:

我的 SQL 生锈了,我必须解决一个问题。我在三个表中有数据,如下所示。在 table1 和 table2 列中,用户名都是唯一的!

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

知道我应该如何使用单个 SQL 命令执行此操作吗?我可以(而且我已经做到了)编写一个 php 脚本,但它应该是一个(复杂的)SQL 命令!

我尝试过 join、inner join 等,但作为一个偶尔使用 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

【问题讨论】:

标签: mysql


【解决方案1】:
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;

【讨论】:

  • 我们生活在一个多么美好的世界!在我发布问题几分钟后,就出现了两个答案。 @McNets 答案(我使用了选项 2)效果很好,所以我接受了这个答案,因为它更清楚一些(尽管我编辑了等号的两个选项)而且似乎 Avidos 的答案有错字,我没有检查它,但我相信它会工作!无论如何感谢 McNets 和 Avidos。
  • 看来我无法在发布时编辑已接受的答案(或者我不知道怎么做?!)。为了使答案与所提问题一致,2016 年之前的符号应为 =。当然,很明显!再次感谢。
【解决方案2】:

你可以试试这个,伙计:

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;

【讨论】:

  • 非常感谢 Avidos。自从我将评论发布到 @McNets 并接受他的回答后,您似乎已经编辑了您的答案!
  • @user3560520 是的,编辑了几次以提供simplest 答案,我可以在满足您的问题的同时提供。欢呼
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多