MySQL根据接受的条件查找最近更新的项
我有一个包含以下列的表:MySQL根据接受的条件查找最近更新的项,mysql,Mysql,我有一个包含以下列的表: 身份证 身份证号码 描述 登记日期 接受 id_编号不是唯一的,因为我可以在同一个表上有多个元素。我只需要找到每个id_编号的一个元素,并满足以下条件: 如果该项目已被接受至少一次,我需要与较新的注册日的项目,但只看其类型的接受 如果该项目尚未被接受,那么我需要已注册的最新项目 例如,如果我有以下数据: ID Id_Number Description Register_Date Accepted =========
- 身份证
- 身份证号码
- 描述
- 登记日期
- 接受
- 如果该项目已被接受至少一次,我需要与较新的注册日的项目,但只看其类型的接受
- 如果该项目尚未被接受,那么我需要已注册的最新项目
ID Id_Number Description Register_Date Accepted
==============================================================================
1 TA-001 This is a test 19/02/2015 15:40:35 0
2 TA-004 test 27/03/2015 12:00:18 1
3 DCMIX-001 test 01/01/2011 00:00:00 0
4 TA-005 test 01/01/2010 00:00:00 0
5 TA-001 different description 25/03/2015 11:07:42 1
6 TA-001 not accepted but newer 25/03/2015 11:53:42 0
7 TA-005 test 27/03/2015 13:10:21 0
将生成此输出:
ID Id_Number Description Register_Date Accepted
==============================================================================
2 TA-004 test 27/03/2015 12:00:18 1
3 DCMIX-001 test 01/01/2011 00:00:00 0
5 TA-001 different description 25/03/2015 11:07:42 1
7 TA-005 test 27/03/2015 13:10:21 0
非常感谢您抽出时间。如果该商品至少被接受过一次,我需要具有较新注册日期的商品,但只查看已接受的同类商品。
SELECT *
FROM (SELECT id_number,MAX(register_date) FROM mytable WHERE accepted = 1 GROUP BY id_number) accepted
JOIN mytable ON (mytable.id_number = accepted.id_number AND mytable.register_date = accepted.register_date)
SELECT *
FROM
(
SELECT id_number
FROM mytable
GROUP BY id_number
HAVING SUM(accepted) = 0
) not_accepted
LEFT JOIN mytable ON (mytable.id_number = not_accepted.id_number)
GROUP BY mytable.id_number
ORDER BY register_date DESC
如果项目未被接受,则我需要已注册的最新项目。
SELECT *
FROM (SELECT id_number,MAX(register_date) FROM mytable WHERE accepted = 1 GROUP BY id_number) accepted
JOIN mytable ON (mytable.id_number = accepted.id_number AND mytable.register_date = accepted.register_date)
SELECT *
FROM
(
SELECT id_number
FROM mytable
GROUP BY id_number
HAVING SUM(accepted) = 0
) not_accepted
LEFT JOIN mytable ON (mytable.id_number = not_accepted.id_number)
GROUP BY mytable.id_number
ORDER BY register_date DESC
请尝试以下查询:
SELECT l.*
FROM mytable l # 'l' from 'last'
LEFT JOIN mytable n # 'n' from 'newer'
ON l.id_number = n.id_number # match by in_number
AND (l.accepted < n.accepted OR # 'l' < 'n' on (accepted, register_date)
l.accepted = n.accepted AND l.register_date < n.register_date)
WHERE n.id_number IS NULL # 'n' (newer) does not exist
回到查询,连接条件的一部分是l
的(已接受,注册日期)
小于同一对n
由于LEFT JOIN
,当l
(左表)的一行在n
(右表)中没有匹配项时,将使用一行充满NULL
s(用于n
的列)
联接条件将l
中的所有行与n
中具有相同id\u编号
且在(已接受,注册日期)
部分上更大的行相匹配。最大值为(已接受,注册日期)
的l
行将在n
中没有任何匹配项,以NULL
s完成
WHERE
子句仅在从n
中选择的列中保留NULL
的行,这意味着它们在(已接受,注册日期)
对上具有最大值
最后,SELECT
子句从左表l
中提取所需的列(反正n
的列都是NULL
)
使用其他
WHERE
条件(如果需要)完成查询,并添加相应的orderby
表达式以获得所需顺序的行。到目前为止您尝试了什么。StackOverflow不是代码生成器服务。您尝试的查询的具体问题是什么?请阅读更多关于在StackOverflow中询问的信息。这是MySQL-所以这些不是日期!!我最大的问题是,我试图在一个查询中得到整个结果,到目前为止,这是不可能的。看到第一个答案,我的方法似乎是错误的。这不是我想要的免费代码。@这是一个类似西班牙语的日期格式的日期时间。第一个查询不会产生所需的结果<代码>排序依据适用于分组依据
之后,它对组进行排序,而不是对组内的条目进行排序。@axiac你说得对,我总是喜欢这个。。修正了。第一位代码看起来还可以。第二段代码留下了许多待设计的代码。这似乎有帮助。我试图在同一个查询中获得所有结果,但没有成功。这成功了!比另一个短,并且只在一个查询中。不,我会按id_号码订购,它会满足我的所有需求,谢谢。标记为接受,因为它比其他答案好