Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅检索范围之间每个组的最后一条记录_Mysql_Group By_Inner Join - Fatal编程技术网

Mysql 仅检索范围之间每个组的最后一条记录

Mysql 仅检索范围之间每个组的最后一条记录,mysql,group-by,inner-join,Mysql,Group By,Inner Join,我的桌子是空的 我想根据每个用户id组的id检索最后一条记录,但前提是它在下一个联系人日期范围之间 期望输出 如果用户选择检索2022-08-01和2022-08-15之间的记录,则应 +-------+----------------+---------+--------------+-------------------+ | id | invoice_number | user_id | created_date | next_contact_date | +-------+----

我的桌子是空的

我想根据每个用户id组的id检索最后一条记录,但前提是它在下一个联系人日期范围之间

期望输出

如果用户选择检索2022-08-01和2022-08-15之间的记录,则应

+-------+----------------+---------+--------------+-------------------+
|  id   | invoice_number | user_id | created_date | next_contact_date |
+-------+----------------+---------+--------------+-------------------+
| 42700 |            100 |      30 | 2021-05-19   | 2022-08-08        |
| 42701 |            100 |     235 | 2021-05-20   | 2022-08-08        |
| 42702 |            100 |     236 | 2021-05-19   | 2022-08-09        |
+-------+----------------+---------+--------------+-------------------+
那很好

如果现在用户选择检索2022-08-01和2022-08-05之间的记录,则该记录应为空,因为每个用户id组的最后一个id不在下一个联系人日期内

我试过的

我在下面得到的结果不是我想要的结果。结果应该是空的,因为最后的记录不属于用户指定的下一个联系人日期范围

+-------+----------------+---------+-----------------+-------------------+
|  id   | invoice_number | user_id |    created_date | next_contact_date |
+-------+----------------+---------+-----------------+-------------------+
| 42696 |            100 |      30 | 2021-05-01      | 2022-08-02        |
| 42697 |            100 |     235 | 2021-05-03      | 2022-08-04        |
| 42698 |            100 |     236 | 2021-05-04      | 2022-08-02        |
+-------+----------------+---------+-----------------+-------------------+

您需要进一步的子查询来捕获在所选时间范围内的所有用户id

并使用user_id获取最后的id,但只选择时间范围内的那些行


dbfiddle

但请注意,没有以SELECT*开头并以GROUP BY结尾的内容。。。你有3个用户ID,我不明白为什么30是gouble,这就是为什么我们如此喜欢结构良好的问题,并提供有关如何构建它们的信息。@nbk我很抱歉这是一个错误创建后。@草莓我很抱歉,我不想被不尊重。你为什么认为我的问题结构不合理?我读了你给我的文章,我没有看到我做了任何不同于它所说的在2022-08-01和2022-08-05之间更改搜索的事情。它不会返回每个用户id组的最后记录。哦,是的,它是这样做的,因为每个用户id组只剩下三行。请参见否。。。这些记录不是每个用户id的最后一个记录。对于用户id=30,最后一个记录是42700,对于用户id=235,最后一个记录是42701,对于用户id=236,最后一个记录是42702。不,它们不是,因为您只选择了2022-08-01和2022-08-05之间的行,如链接中所示,只剩下3行。Mysql接受您在where子句中所做的选择,并应用GROUPBY。或者,如果泰伊不在乎你说的对的话,就干脆跳过日期。但是,我的要求是,如果且仅当“下一个联系人日期”列值介于用户提供的日期之间时,我才需要携带最新的记录。
SELECT * FROM mytable WHERE id IN 
                    (SELECT MAX(id) AS id FROM mytable where mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999' GROUP BY user_id)
+-------+----------------+---------+-----------------+-------------------+
|  id   | invoice_number | user_id |    created_date | next_contact_date |
+-------+----------------+---------+-----------------+-------------------+
| 42696 |            100 |      30 | 2021-05-01      | 2022-08-02        |
| 42697 |            100 |     235 | 2021-05-03      | 2022-08-04        |
| 42698 |            100 |     236 | 2021-05-04      | 2022-08-02        |
+-------+----------------+---------+-----------------+-------------------+
CREATE TABLE mytable
    (`id` int, `invoice_number` int, `user_id` int, `created_date` date, `next_contact_date` date)
;
    
INSERT INTO mytable
    (`id`, `invoice_number`, `user_id`, `created_date`, `next_contact_date`)
VALUES
    (42699, 100, 236, '2021-05-19', '2022-08-09'),
    (42693, 100, 236, '2021-03-01', '2022-08-09'),
    (42694, 100, 30, '2021-03-01', '2022-08-08'),
    (42695, 100, 235, '2021-03-03', '2022-08-09'),
    (42696, 100, 30, '2021-05-01', '2022-08-02'),
    (42697, 100, 235, '2021-05-03', '2022-08-04'),
    (42698, 100, 236, '2021-05-04', '2022-08-02'),
    (42700, 100, 30, '2021-05-19', '2022-08-08'),
    (42701, 100, 235, '2021-05-20', '2022-08-08'),
    (42702, 100, 236, '2021-05-19', '2022-08-09')
;
SELECT * FROM mytable WHERE id IN 
                    (SELECT MAX(id) AS id FROM mytable 
                    where `user_id` IN 
                    (SELECT `user_id` FROM mytable WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999')
                    GROUP BY user_id)
AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-05 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date -: | -------------: | ------: | :----------- | :----------------
SELECT * FROM mytable WHERE id IN 
                    (SELECT MAX(id) AS id FROM mytable 
                    where `user_id` IN 
                    (SELECT `user_id` FROM mytable 
                    WHERE mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999')
                    GROUP BY user_id)
AND mytable.next_contact_date BETWEEN '2022-08-01' AND '2022-08-15 23:59:59.999'
id | invoice_number | user_id | created_date | next_contact_date ----: | -------------: | ------: | :----------- | :---------------- 42700 | 100 | 30 | 2021-05-19 | 2022-08-08 42701 | 100 | 235 | 2021-05-20 | 2022-08-08 42702 | 100 | 236 | 2021-05-19 | 2022-08-09