我如何从MySQL中选择一个月内但下个月可能有日期的所有行?

问题描述 投票:0回答:1

我有一张看起来像这样的桌子;

ID | netID | indate             | outdate           | name    | org
=====================================================================
1  |  50   | 2020-03-31 23:50   | 2020-03-31 23:32  | Bill    | orgA
2  |  50   | 2020-03-31 23:51   | 2020-03-31 23:32  | Fred    | orgA
3  |  50   | 2020-04-01 00:02   | 2020-04-01 00:05  | Sam     | orgA

4  |  51   | 2020-03-31 23:50   | 2020-03-31 23:32  | Harry   | orgB    
5  |  51   | 2020-03-31 23:51   | 2020-03-31 23:32  | George  | orgB
6  |  51   | 2020-04-01 00:02   | 2020-04-01 00:05  | Tom     | orgB

我需要按组织,年份和月份编写报告,但是必须包含具有相同netID的任何行,即使该行在不同的年份或月份中也是如此。而且我不能说“ WHERE netID = 50”,因为我不知道“ 2020”年的“ 03”月中的netID是什么。

如果我需要2020年3月的orgA报告,我正在寻找要返回的前三行。

以下内容无法满足我的需要,而且我无法弄清楚如何获得每个netID的所有行,而与月份无关。有人可以给我一个如何找回它们的例子吗?

SELECT date(iodate) as logdate,
       Name,
       netID,
       COALESCE( netID, 'Month Total') AS netTTL,
       COUNT(ID) AS idCount,
       month(logdate AS month    
  FROM table
 WHERE org = 'orgA'
   AND year(indate) = '2020'
   AND month(iodate) = '03'
 GROUP BY year(logdate), month, netID WITH ROLLUP
mysql
1个回答
0
投票

一种获取存在任何行的所有行的方法,该行具有相同的净ID,所请求的组织和所请求范围内的日期,这是在派生表中获取该范围和组织的净ID,然后将其联接到表中。

SELECT t1.*
       FROM (SELECT DISTINCT
                    t2.netid
                    FROM elbat t2
                    WHERE t2.org = 'orgA'
                          AND t2.indate >= '2020-03-01'
                          AND t2.indate < '2020-04-01') x
            INNER JOIN elbat t1
                       ON t1.netid = x.netid;

一些注意事项:

  • 您应该使用范围表达式,而不是对year()子句中的日期应用month()WHERE。范围表达式可以使用索引并加快查询的速度。
  • 在查询中,您具有既不应用于聚合函数也不应用于GROUP BY的列/表达式。尽管较旧的或配置错误的MySQL服务器可以接受,但可能会产生有趣的结果。但是,由于您没有进一步说明要在此处做的事情,因此这里只说了“您做错了!”。
© www.soinside.com 2019 - 2024. All rights reserved.