【问题标题】:Query to retrieve the latest entry in a history table in Laravel 5.2在 Laravel 5.2 中查询以检索历史表中的最新条目
【发布时间】:2017-05-11 08:20:46
【问题描述】:

这是桌子

表: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();

请帮忙

【问题讨论】:

  • 那是 5 月 1 日还是 1 月 5 日?
  • 五月一日

标签: php mysql controller laravel-5.2


【解决方案1】:

您可以执行降序并接收第一行,这将是您在数据库中的最后一行。但问题是您以错误的方式存储日期。正如@Strawberry 所提到的,它的日期或月份不明确。我建议您使用 mysql datetime 选项,然后您可以简单地执行我在下面发布的代码。在这种情况下,您可能必须以正确的方式解析每个日期

$englishgrades = StudentHistory::select('date', 'name', 'grade')
->where('subject', 'english')
->groupBy('name')
->orderBy('date','desc')
->get();

【讨论】:

  • 不应该是->orderBy('date','desc')吗?
  • 就是这样,然后我更改了它,因为我对您要执行的操作感到有点困惑 :) 您将仅按日期或所有这些字段排序??
  • 是的,只是按日期。但是,当我应用它时,所有列现在都在打印,从 ID 到主题。当我注释掉 first() 时,它又回到了我选择的三件事上。你知道为什么吗?
  • 其实又全部打印出来了
  • 所有列?它正常吗?你想获得专栏吗?您没有在第一行使用 select StudentHistory::select('date', 'name', 'grade') 编辑了我的答案
【解决方案2】:

我不知道在这种情况下你所说的“填充”是什么意思,我也不知道 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 |
+----+------------+------+-------+---------+

【讨论】:

  • 您可以在查询生成器中执行此操作吗?
  • 如果您认为这是答案,那么这是一个重复的主题,请参阅stackoverflow.com/questions/7745609/… 我还没有投票的唯一原因是因为这个问题是针对 laravel 的,而 OP 往往更喜欢这样的答案使用查询生成器而不是原始 sql。我会使用原始 sql :)
  • 感谢您指出阴影。我特别在 Laravel 中为我的控制器寻找一个查询构建器。我看到了你引用的那个帖子,那就是 MySQL
  • @Rodrane 真的吗?我可以只使用原始代码并使用该代码吗?让我试试。
  • @Rodrane,我想我会偏头痛。大声笑,这就是为什么我更喜欢查询生成器。草莓如果你能解释一下,用英语解释,那我想我可以试试用那个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2017-03-04
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多