【问题标题】:MySQL select older rows than x days, group by and order by and limitMySQL选择比x天更旧的行,分组依据和排序依据和限制
【发布时间】:2013-12-22 09:49:24
【问题描述】:

很久以前我做了一个非常丑陋的 SQL 表。但现在我需要使用其中的数据。 该表如下所示: id => 1 video_id => gds1513sfsd51 user_ip => 244.154.16.. datum => 2011-01-11 10:10:10 referer => http://something.com user_id => 1

我希望这些行超过 30 天,但我想通过 video_idorder id desc 来 group 他们

所以,这些是行

id          video_id            ip               datum                user_id
527557  152547560451c58ca74e2e8 162.217.250.110 2013-11-18 21:53:10     1
527556  152547560451c58ca74e2e8 162.217.250.110 2013-11-18 21:53:07     1
527369  152547560451c58ca74e2e8 162.217.250.110 2013-11-18 21:37:03     1
515760  152547560451c58ca74e2e8 108.178.60.2    2013-11-15 02:33:45     1
515763  252547560451c58ca74e2e9 108.178.60.2    2013-10-15 02:33:45     2
515764  252547560451c58ca74e2e9 108.178.60.5    2013-10-14 02:33:45     2

我只想获取 id 为 515763 的行,因为那已经超过一个月了,并且没有更新的 video_id

我已经尝试过制作这样的东西:

    $format = 'Y-m-j G:i:s'; 
    $date = date ( $format ); 
    // - 1 month from today 
   $datum = date ( $format, strtotime ( '-1 month' . $date ) );

$query = 'SELECT * FROM video_megtekintes WHERE datum <= "'.$datum.'" group by video_id order by id desc LIMIT 100';

print($query.'<hr>');
$le = mysql_query($query);

while($i = mysql_fetch_assoc($le)){
print($i["video_id"].' - '.$i["datum"].'');
$ok = mysql_fetch_assoc(mysql_query('SELECT * FROM video_megtekintes WHERE video_id="'.$i["video_id"].'" ORDER BY id DESC LIMIT 1'));
print(' - <b>'.$ok["datum"].'</b><br>');
//

但是现在的输出是这样的: (video_id | datum | 和最新行的数据具有相同的video_id)

video_id                   datum               from_a_new_query_it_shows_me_there_is_newer
1000657739521a10654224f - 2013-08-25 19:15:26 - 2013-12-05 05:56:20
100155265051bde3b822f84 - 2013-06-18 20:59:31 - 2013-11-04 23:48:06
10024035651dc34f02b5d4 - 2013-07-14 10:10:52 - 2013-10-04 19:57:06

我不想看到第一行,因为它有两个日期。那个 video_id 的日期比一个月新。请帮帮我好吗?

这是查询:

$query = 'SELECT * FROM video_megtekintes WHERE datum <= "'.$datum.'" group by video_id order by id desc LIMIT 100';

【问题讨论】:

  • 目前还不清楚(至少对我而言),产生所示结果集的查询是什么。此外,如果您不想看到第一行,那么您也不想看到其他 2 行,对吗?
  • 你试过ORDER BY datum DESC而不是ORDER BY id吗?
  • 数据 > DATE_SUB(NOW(),INTERVAL 1 MONTH) AND NOW()
  • 如果这是产生该输出的查询,那么当您选择的表只有 1 个日期列时,为什么输出包含 2 个日期字段?
  • 这部分$datum = date ( $format, strtotime ( '-1 month' . $date ) );错了,应该是逗号而不是句号:strtotime ( '-1 month', $date )

标签: php mysql date group-by sql-order-by


【解决方案1】:

这将为您提供超过 1 个月的记录的最新 video_id(即只有 1 行)。而且video_id在上个月没有任何记录。

SELECT *
FROM video_megtekintes
JOIN (
   SELECT video_megtekintes.video_id AS video_id, MAX(video_megtekintes.datum) as maxdate
   FROM video_megtekintes 
   LEFT JOIN video_megtekintes AS newer_t
     ON newer_t.video_id = video_megtekintes.video_id
       AND newer_t.datum > DATE_SUB(NOW(),INTERVAL 1 MONTH)
   WHERE video_megtekintes.datum <= DATE_SUB(NOW(),INTERVAL 1 MONTH)
      AND newer_t.video_id IS NULL
   GROUP BY video_id) AS t1
  ON video_megtekintes.datum = t1.maxdate
    AND video_megtekintes.video_id = t1.video_id

【讨论】:

  • 你明白我想做什么。超过 1 个月的最新 video_id。 :-) 但这给了我相同的结果。 (我把 t1.video.id 修改为 t1.video_id...但是给了我同样的结果。)
  • @user2301881 - 此更改消除了在上个月内也有条目的 video_id。
  • 模棱两可是什么意思? Column 'datum' in field list is ambiguous
  • @user2301881 - 这意味着 MySQL 不知道要使用哪个“数据”。要解决它,请在列名之前放置表别名和句点 (.)。我更改了上面的查询以反映更改(它在 MAX() 函数中)
  • 是的,我想通了。 :-) 我认为它应该可以工作,但只会给我 500 个错误,即使我将限制设置为 1 ......所以甚至无法获得第一行。 :-s (我的英语有点差,我无法翻译那个词:-))
猜你喜欢
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多