我无法创建查询,该查询给出了group by和最近记录的结果。
我的会员表就像这样
ID PlotID Requirement DateTime
1 G23 text1 2016.08.10 10.10.10
2 G23 text2 2016.08.10 12.12.12
3 B11 text3 2016.08.10 4.5.6
4 G23 text4 2016.08.10 12.16.16
我希望在我的报告中按PlotIC
分组显示,但最近的记录
输出应为
G23 text4 2016.08.10 12.16.16
B11 text3 2016.08.10 4.5.6
Select * from member group by plotid order by datetime
这不是我想要输出的结果。它始终为我提供G23
的第一条记录,但不是G23
的最新记录。
你能给出正确的查询吗?
答案 0 :(得分:0)
您现有的查询仅有效,因为mysql
允许您在select
语句中包含不属于group by
的列。但是,为该分组返回的列是任意的。
以下是使用带有子查询和join
的{{1}}的一个选项:
max
另一个使用select m.id, m.plotid, m.requirement, m.datetime
from member m
join (select plotid, max(datetime) maxdatetime
from member
group by plotid) m2 on m.plotid = m2.plotid
and m.datetime = m2.maxdatetime
:
exists
答案 1 :(得分:0)
因为GROUP BY对字符串值有奇怪的响应,比如奇怪的'DateTime'试试这个
SELECT mr1.* FROM member mr1 JOIN
(SELECT PlotID,MAX(ID) Id2 FROM Member GROUP BY PlotID) mr2
ON mr.ID=mr2.Id2
这应该给你想要的东西 内部选择为您提供每个PlotID的所有最后一个ID,第一个SELECT为您提供所有这些ID的数据
答案 2 :(得分:0)
使用Max()函数:
select PlotID,Requirement,Max(DateTime) from member group by PlotID;
我试了一下:
mysql> DESC member;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| ID | int(11) | NO | PRI | NULL | |
| Plotid | varchar(45) | YES | | NULL | |
| Requirement | varchar(45) | YES | | NULL | |
| Datetime | datetime | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM member;
+----+--------+-------------+---------------------+
| ID | Plotid | Requirement | Datetime |
+----+--------+-------------+---------------------+
| 1 | G23 | text1 | 2016-08-10 10:10:10 |
| 2 | G23 | text2 | 2016-08-10 12:12:12 |
| 3 | G11 | text3 | 2016-08-10 04:05:06 |
| 4 | G23 | text4 | 2016-08-10 12:16:16 |
+----+--------+-------------+---------------------+
4 rows in set (0.00 sec)
mysql> SELECT Plotid,Requirement,Max(Datetime) FROM member GROUP BY Plotid;
+--------+-------------+---------------------+
| Plotid | Requirement | Max(Datetime) |
+--------+-------------+---------------------+
| G11 | text3 | 2016-08-10 04:05:06 |
| G23 | text1 | 2016-08-10 12:16:16 |
+--------+-------------+---------------------+
2 rows in set (0.00 sec)
答案 3 :(得分:0)
通过PlotID从中间组中选择PlotID,Requirement,Max(DateTime);
上面的查询会给你错误,因为在group by子句中没有使用需求字段,也没有像sum,count等任何聚合函数。
试试这个......
SELECT Gr.Id,m.Requirement,Gr.DateTime FROM member m
JOIN
(SELECT PlotID,MAX(ID) Id FROM Member GROUP BY PlotID)Gr
ON m.ID = Gr.Id