需要查询来检索最新数据,还需要groupby

时间:2016-08-31 02:11:54

标签: php mysql sql

我无法创建查询,该查询给出了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的最新记录。

你能给出正确的查询吗?

4 个答案:

答案 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