【问题标题】:Mysql, PDO "rank"Mysql,PDO“排名”
【发布时间】:2012-06-26 17:20:40
【问题描述】:

我在试图弄清楚如何完成以下操作时遇到了一些麻烦。

我的桌子:

id:  schema:  updated_date

1    sometext  2012-01-01
1    sometext  2012-02-02
1    sometext  2011-03-03
1    sometext  2010-04-04
2    sometext  2012-04-05
2    sometext  2012-06-07
2    sometext  2011-04-01
2    sometext  2010-09-09

现在,我想要完成的是从表中选择所有内容,并根据 id 获取所有不同的记录,这应该给我两行,棘手的部分是根据 updated_date 获取结果,我想要最新的.所以根据上表,我希望能够提取以下2条记录:

1    sometext  2012-02-02
2    sometext  2012-06-07

谁能帮我做这个我MySQL,我正在使用PHP PDO。

表结构:

CREATE TABLE IF NOT EXISTS `mail_schema` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `message` text NOT NULL,
  `updated_by` int(11) NOT NULL,
  `last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

表格数据:

INSERT INTO `mail_schema` (`id`, `name`, `message`, `updated_by`, `last_updated`) VALUES
(1, 'nummer et', '<p>\n med tekst</p>\n', 3, '2012-06-25 18:56:21'),
(1, 'nummer 2', '<p>\n  med tekst</p>\n', 3, '2012-06-25 18:56:46'),
(1, 'test', '<p>\n  test</p>\n', 3, '2012-06-25 18:57:38'),
(1, 'test igen', '<p>\n asd</p>\n', 3, '2012-06-25 18:58:28'),
(2, 'test 5', '<p>\n    asd</p>\n', 3, '2012-06-25 18:59:11'),
(3, 'test 6', '<p>\n    med id 3</p>\n', 3, '2012-06-25 18:59:37'),
(2, 'test 5', '<p>\n    asd version 2</p>\n', 3, '2012-06-25 19:00:46');

【问题讨论】:

    标签: php mysql select pdo distinct


    【解决方案1】:
    SELECT * FROM `table` GROUP BY `id` ORDER BY updated_date DESC;
    

    那没用?

    【讨论】:

    • 这似乎有效,虽然我得到的是每个 id 最旧的帖子,而不是最新的。我尝试过使用 ASC 而不是 DESC,但没有任何运气。
    • @Mathias 它返回了正确的结果,id 2 仅首先显示。 LINK
    • 我通过此查询获得 3 条记录。我在表中有 7 行,但只有 3 个唯一 ID,所以这很好,但它选择 3 行中最旧的而不是最新的。
    【解决方案2】:

    嗯?

    SELECT * FROM `table` GROUP BY `id` ORDER BY `date`
    

    【讨论】:

      【解决方案3】:

      您需要在 SQL 查询中使用GROUP BY 子句。

      我相信这样的查询应该可以工作:

      SELECT * FROM `table` GROUP BY `id`, `updated_date` DESC ORDER BY `id` ASC
                                                          ^
                                                          Might need to be ASC
      

      【讨论】:

      • 不确定这是做什么的,但它似乎不起作用,这是我的代码中的 sql (抱歉有关日期字段的错误信息): $stmt = $this->dbh- >prepare("SELECT id,name,message,updated_by,last_updated FROM mail_schema GROUP BY id, last_updated ASC ORDER BY id ASC");这给了我表中的所有记录?
      • 尝试在开头添加:SELECT DISTINCT( id), *,而不是SELECT *
      • $stmt = $this->dbh->prepare("SELECT DISTINCT(id), * FROM mail_schema GROUP BY id, last_updated DESC ORDER BY id ASC");给出一个空结果
      • SELECT DISTINCT( id), * FROM mail_schema ORDER BY last_updated DESC
      • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '* FROM mail_schema ORDER BY last_updated DESC LIMIT 0, 30' 附近使用正确的语法
      【解决方案4】:

      四处寻找,我找到了这个解决方案:

      SELECT * FROM (SELECT * FROM mail_schema ORDER BY last_updated DESC) AS x GROUP BY id
      

      虽然看起来有点丑,但它让我更进一步。

      【讨论】:

        猜你喜欢
        • 2016-06-28
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2021-06-05
        • 1970-01-01
        • 2015-11-04
        相关资源
        最近更新 更多