MySQL选择早于x天的行,分组依据、排序依据和限制


MySQL select older rows than x days, group by and order by and limit

我很久以前就制作了一个非常难看的SQL表。但现在我需要使用它的数据。表格如下所示:id => 1video_id => gds1513sfsd51user_ip => 244.154.16..datum => 2011-01-11 10:10:10referer => http://something.comuser_id => 1

我想让这些行超过30天,但我想通过video_id group,通过id desc order

这些是行

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';

这将为超过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