这是表格
表:StudentHistory
id | date | name | grade | subject
---- | ------ |------ |--------|------
1 | 5/1/2017 |Mark | a | science
2 | 7/1/2016 |Earl | c | english
3 | 2/1/2015 |John | a | english
4 | 6/1/2016 |Mike | c | science
5 | 4/1/2016 |Matt | e | english
6 | 2/1/2017 |Mark | d | science
7 | 3/1/2016 |Earl | a | english
8 | 7/1/2015 |John | d | english
9 | 8/1/2016 |Mike | c | science
我想要发生的事情是只为英语学生填写最新成绩。它应该显示如下
7/1/2016 Earl c
7/1/2015 John d
4/1/2016 Matt e
我得到了这个,但它没有提供基于
的最新信息 $englishgrades = StudentHistory::('date', 'name', 'grade')
->where('subject', 'english')
->groupBy('name')
->get();
请帮忙
答案 0 :(得分:0)
您可以执行降序并接收第一行,该行将成为数据库中的最后一行。但问题是你以错误的方式存储日期。正如@Strawberry提到的那样,日期或月份不明确。我建议您使用 mysql datetime 选项,然后您可以简单地执行我在下面发布的代码。在这种情况下,您可能必须以正确的方式解析每个日期
$englishgrades = StudentHistory::select('date', 'name', 'grade')
->where('subject', 'english')
->groupBy('name')
->orderBy('date','desc')
->get();
答案 1 :(得分:0)
我不知道你的意思是什么?填充'在这种情况下,我不知道laravel;但这是一个获得所需结果的查询...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,date DATE NOT NULL
,name VARCHAR(12) NOT NULL
,grade CHAR(1) NOT NULL
,subject VARCHAR(12) NOT NULL
);
INSERT INTO my_table VALUES
(1,'2017/5/1','Mark','a','science'),
(2,'2016/7/1','Earl','c','english'),
(3,'2015/2/1','John','a','english'),
(4,'2016/6/1','Mike','c','science'),
(5,'2016/4/1','Matt','e','english'),
(6,'2017/2/1','Mark','d','science'),
(7,'2016/3/1','Earl','a','english'),
(8,'2015/7/1','John','d','english'),
(9,'2016/8/1','Mike','c','science');
SELECT a.*
FROM my_table a
JOIN
( SELECT name
, MAX(date) date
FROM my_table
WHERE subject = 'English'
GROUP
BY name
) b
ON b.name = a.name
AND b.date = a.date;
+----+------------+------+-------+---------+
| id | date | name | grade | subject |
+----+------------+------+-------+---------+
| 2 | 2016-07-01 | Earl | c | english |
| 5 | 2016-04-01 | Matt | e | english |
| 8 | 2015-07-01 | John | d | english |
+----+------------+------+-------+---------+