【问题标题】:In PHP, how do I ask a mySQL database to retrieve multiple most recent records that match a certain value?在 PHP 中,如何让 mySQL 数据库检索与某个值匹配的多个最新记录?
【发布时间】:2011-09-08 01:02:59
【问题描述】:

我有一个包含以下字段的表:

candy_name
candy_type
candy_amount
candy_vendor

一个 candy_type 可以有多个 candy_name,例如“gummis”可能有“orange”、“watermelon”、“sour watermelon”等等。

我正在做的是按供应商搜索此表,然后我想查看每个唯一 candy_type 的最新条目(忽略 candy_name)。也就是说,每个唯一 candy_type 最近添加的行。

所以我发现了如何在该表中查找所有独特的 candy_types:

$sql = "SELECT DISTINCT candy_type FROM candy_table 
               WHERE candy_vendor LIKE '%$user_searchbox_input%' 
               ORDER BY candy_vendor ASC";
$result=mysql_query($sql);

现在我需要了解如何检索每个唯一 candy_type 的 MOST RECENT 记录。

就像 candy_type 的“gummi”一样,如果与该类型匹配的最后一条记录是“orange”,那就是我想看到的——而不是其他的。
对于“chocolate”的candy_type,如果最后匹配的记录是“milk”,我不关心其他记录,但我想检索与candy_type匹配的最新记录。

我该怎么做?

【问题讨论】:

  • 你如何定义“最近的”?是最后添加的还是最后更新的?还是最后访问的那些?你的表结构是什么?您似乎没有提供足够的信息。
  • @Aleks,你不需要那么多信息,Jerry 可以自己修改代码。最近 = having timestamp = max(timestamp) OP 需要做的就是重命名该字段以适应他的数据库架构。
  • @Aleks,最后添加的。我没有想到这可能会产生误导。我将更改我的原始帖子。谢谢!

标签: php mysql select


【解决方案1】:

如果您想要最新的,请使用 having 子句和 group by,因为 group by 已经选择了不同的列,您可以删除 distinct 子句。

$user_searchbox_input = mysql_real_escape_string($user_searchbox_input);
$sql = "SELECT candy_type FROM candy_table 
               WHERE candy_vendor LIKE '%$user_searchbox_input%' 
               GROUP BY candy_vendor 
               HAVING timeadded = MAX(timeadded)
               ORDER BY candy_vendor ASC";
$result=mysql_query($sql);

见:http://www.techonthenet.com/sql/having.php

【讨论】:

  • 我确实有一个 candy_date 字段...我应该使用它吗?还是“加时”是我不知道的 PHP / MYSQL 的事情?
  • @Jerry,很好,替换 timeadded 字段,没有 timeadded 只是我的发明。如果它流行起来,我可能会申请专利。
  • 我认为这行得通;但是对于HAVING子句,我怎么说“为candy_date选择最大值”?
  • @Jerry,别傻了:HAVING candy_date = MAX(candy_date)
  • 我相信我已经找到了答案!谢谢!
【解决方案2】:

不幸的是,从这四列中无法判断哪条记录是最新的。

我建议通过 ALTER TABLE 命令添加一个 date_time 列。有需要的可以参考http://dev.mysql.com/doc/refman/5.1/en/alter-table.html语法帮助。

这对您当前的查询没有帮助,但对以后的任何查询都有帮助。

【讨论】:

  • 我确实有一个 time_column,但不确定是否有必要,或者它是否可以检查数据库中的最新行。知道我已经有这样一列已经填充了有用的数据,现在该怎么办?
  • 如果你有一个时间列并且它包含记录插入的日期/时间,那么我会执行以下操作:“SELECT FROM candy_table ORDER BY DESC LIMIT 1”。
  • 如果 PK 是整数 auto_increment 那么这是一个非常好的创建时间向量,不需要时间戳字段。
【解决方案3】:

按 create_date (ORDER BY) 或任何创建时间戳对数据进行排序,然后执行 SELECT * FROM tbl LIMIT 1; # 获取第一行

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多