MYSQL Inner根据某些条件连接表本身,以显示全部或全部

时间:2018-06-12 08:13:15

标签: mysql

考虑表格:

    public ActionResult Report(Models.ReportRequest[] data)
    {
        // Handle list of received data
        return null;
    }

我能做出的最有效的自联接查询是什么,为了产生只返回前3条记录(编号= 1)的记录,考虑条件是日期必须在2016年之前。

例如,文件号2根本不会显示,因为其中一个日期是> 2016年,但是所有3个记录都将显示第1号文件,因为所有3个日期都是< 2016

我尝试了以下内容:

table
no     |    date
--------------------------------
1      | 2015-03-17 00:00:00.000
1      | 2015-03-17 00:00:00.000
1      | 2015-03-17 00:00:00.000
2      | 2015-03-01 00:00:00.000
2      | 2016-03-01 00:00:00.000
2      | 2016-03-01 00:00:00.000

但是,返回的结果是

SELECT a.no, a.date 
FROM table a
INNER JOIN table b ON b.no = a.no AND b.date < '2016' --pseudocode for date comparison

4 个答案:

答案 0 :(得分:0)

首先,您可以获取应返回的ID列表,然后使用自联接,如下所示:

select b.*
from table b
join (select id from table group by id having year(max(date)) <2016) x
on (a.no = x.no);

答案 1 :(得分:0)

SELECT t1.* FROM table t1
JOIN
(
    SELECT no, max(date) as max_date FROM table
    GROUP BY no
    HAVING max_date < '2016-01-01'
) t2

ON t1.no = t2.no

答案 2 :(得分:0)

也许我根据您的要求不理解某些事情 - 您不需要自我加入。

  
    

例如,文件号2根本不会显示,因为其中一个日期是&gt; 2016年,但是所有3个记录都将显示第1号文件,因为所有3个日期都是&lt; 2016

  

您需要反加入。

SELECT a.no, a.date 
FROM table A 
WHERE 
    NOT EXISTS(
      SELECT * FROM table B 
        WHERE  
           B.no = A.no 
           AND B.date < DATE('2016-01-01')
    )

答案 3 :(得分:0)

在没有使用JOIN的情况下,有几种方法可以做到这一点!这是一个:

select * from tbl 
where `no` not in
(
    select `no` from tbl
    where `date` >= '2016-01-01 00:00:00.000'
)