sql >> データベース >  >> RDS >> Mysql

クエリを最小化する方法は?

    あなたの質問は意味がありません。まず、データからDISTINCT日付(時間を無視)を選択します。次に、日付ごとに、その日付のすべてのデータを選択しますか?

    1つのクエリを実行してみませんか

    SELECT *, DATE(added) as DateNoTime
    FROM tb_videos
    ORDER BY added desc
    

    5つの日付のみが必要で、テーブルが大きい場合、2つの可能性があります。

    1、日付にギャップはありません、使用できます

    SELECT *, DATE(added) as DateNoTime
    FROM tb_videos
    WHERE added >= ADDDATE(CURDATE(), interval -4 days)
    ORDER BY added desc
    

    2、ギャップがある可能性がある場合、例えば昨日は何もなかったので、過去5日間に記録があるものを表示する必要があります

    SELECT *, DATE(added) as DateNoTime
    FROM (
        select min(DateNoTime) as MinDate
        from
        (
            select DATE(added) as DateNoTime
            FROM tb_videos
            order by DateNoTime desc
            limit 5
        ) x) y, tb_videos
    WHERE added >= y.MinDate
    ORDER BY added desc
    

    これにより、すべてのデータが得られます。 PHPでは、DateNoTimeを追跡します。それが変わるときはいつでも、あなたは別の日付にいます。それは以前にあなたに別のクエリを起動させたでしょう。それ以外の場合、コードは最小限に変更する必要があります。

    未チェックのPHPコード

    $result = mysql_query('
        SELECT *, DATE(added) as DateNoTime
        FROM (
            select min(DateNoTime) as MinDate
            from
            (
                select DATE(added) as DateNoTime
                FROM tb_videos
                order by DateNoTime desc
                limit 5
            ) x) y, tb_videos
        WHERE added >= y.MinDate
        ORDER BY added desc
    ');
    $prevdate = NULL;
    foreach($result as $rst)
    {    
        if($prevdate!=$rst=>DateNoTime) {
            // do something, like printing out a header for each new date
            $prevdate=$rst=>DateNoTime;
        }
    
        // do something with the record
    }
    


    1. MYSQLは、a.table IDを保持しながら、A.tableとb.tableを左結合します

    2. ログイン-リモートmysqlデータベースへの認証

    3. Android.comのSQLデータベースへのデータの保存チュートリアルを理解する

    4. Oracle PL/SQLで呼び出し元のプロシージャまたは関数の名前を取得します