繁体   English   中英

MySQL选择比x天更旧的行,分组和排序并限制

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

很久以前,我做了一个非常丑陋的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天以前,但我想group他们通过video_idorderid降序

所以,这些是行

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没有更新的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM