Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich meine Abfrage minimieren?

Deine Anfragen ergeben keinen Sinn. Zuerst wählen Sie die DISTINCT-Daten (Zeit ignorieren) aus den Daten aus. Wählen Sie dann für jedes Datum alle Daten für dieses Datum aus?

Warum starten Sie nicht einfach eine Abfrage

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

Wenn Sie nur 5 Daten möchten und der Tisch groß ist, gibt es zwei Möglichkeiten.

1, Es gibt nie Lücken in den Daten, die Sie verwenden können

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

2, Falls Lücken vorhanden sein können, z.B. nichts für gestern, also muss es die letzten 5 Tage zeigen, die Aufzeichnungen haben

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

Damit hast du alle Daten. Verfolgen Sie in PHP DateNoTime. Wann immer sich das ändert, befinden Sie sich an einem anderen Datum, was zuvor dazu geführt hätte, dass Sie eine weitere Abfrage ausgelöst hätten. Ansonsten sollte sich der Code nur minimal ändern.

Ungeprüfter PHP-Code

$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
}