Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment minimiser ma requête?

Vos requêtes n'ont aucun sens. Vous sélectionnez d'abord les dates DISTINCT (ignorez l'heure) à partir des données. Ensuite, pour chaque date, vous... sélectionnez toutes les données pour cette date ?

Pourquoi ne lancez-vous pas une seule requête

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

Si vous ne voulez que 5 dates et que le tableau est grand, il y a deux possibilités.

1, il n'y a jamais de lacunes dans les dates, vous pouvez utiliser

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

2, s'il peut y avoir des lacunes, par ex. rien pour hier donc il doit montrer les 5 derniers jours qui ont des enregistrements

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

Cela vous donne toutes les données. En PHP, gardez une trace de DateNoTime. Chaque fois que cela change, vous êtes à une date différente, ce qui vous aurait déjà amené à lancer une autre requête. Sinon, le code ne devrait changer que très peu.

Code PHP décoché

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