Mysql
 sql >> Database >  >> RDS >> Mysql

come ridurre al minimo la mia domanda?

Le tue domande non hanno senso. Per prima cosa stai selezionando le date DISTINCT (ignora l'ora) dai dati. Quindi per ogni data, tu.. selezioni tutti i dati per quella data?

Perché non fai solo una query

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

Se vuoi solo 5 date e il tavolo è grande, ci sono due possibilità.

1, non ci sono mai lacune nelle date, puoi usare

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

2, Se possono esserci delle lacune, ad es. niente per ieri, quindi deve mostrare gli ultimi 5 giorni con record

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

Questo ti dà tutti i dati. In PHP, tieni traccia di DateNoTime. Ogni volta che cambia, sei in una data diversa, che in precedenza ti avrebbe causato l'attivazione di un'altra query. Il codice dovrebbe altrimenti cambiare solo in minima parte.

Codice PHP deselezionato

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