Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Mysql subquery LIMIT

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14

    Mysql subquery LIMIT

    Salve, ho cercato ovunque,ma non riesco a trovare una soluzione al mio problema.
    Sto creando un sito,contenente anche una parte di notizie.
    La pagina principale delle notizie stampa in alto 4 notizie che sono notizie in primo piano
    sotto altre 4 che sono notizie del secondo piano e notizie vecchie del primo piano.
    Gia' solo per realizzare questa parte ho avuto problemi.
    Ovviamente io per le prime 4 notizie ho scritto una select limitata a 4 notizie che mi prende le ultime 4 notizie in primo piano..
    tipo
    codice:
    SELECT *
    FROM notizie
    WHERE posizione_notizia=1    //posizione notizia=1 corrisponde alle notizie in primo piano
    ORDER BY data_notizia DESC 
    LIMIT 4
    Quando dopo sono andato a prendere le 4 notizie per il secondo piano ho scritto questo codice
    codice:
    SELECT *
    FROM notizie
    WHERE posizione_notizia>0 // 1 rappresenta il primo piano 2 il secondo piano
    AND id_notizia NOT IN (SELECT id_notizia
    FROM notizia 
    WHERE posizione_notizia=1    //posizione notizia=1 corrisponde alle notizie in primo piano
    ORDER BY data_notizia DESC 
    LIMIT 4)
    ORDER BY data_notizia DESC
    LIMIT 4
    spero si sia capito cosa dovevo fare in questo caso..ma quando ho provato ad avviare il sito,
    ho riscontrato l'un errore del database che diceva che la mia versione di Mysql non consentiva
    l'uso di limit all'interno di una subquery

    Ho trovato una soluzione non tanto complessa a questo problema, prendendo le prime otto notizie e con due semplici controlli ho evitato le prime 4 notizie in primo piano.

    Preciso che sto ancora lavorando in locale..

    Comunque ovviamente il problema non è quello di mostrare le 4 notizie in secondo piano,ma è quello di mostrare diciamo le notizie in 3 piano..
    In terzo piano dovrei mostrare ben 30 notizie,divise in 15 per colonna..
    nella prima colonna stampo 15 notizie di un certo argomento,nella seconda le 15 notizie di un altro argomento (Es. Cronaca prima colonna Sport seconda colonna).

    Ragioniamo per risolvere una sola colonna,visto che il problema della seconda è identico.
    La colonna "Cronaca" deve stamparmi le ultime 15 notizie di "tipo_notizia='Cronaca'" che non sono state stampate ne in primo piano,ne in secondo piano.
    Quindi anche qui mi servirebbe una subquery contenente limit..
    Non so come risolvere questo problema..qualcuno può aiutarmi?
    Potrei creare un array che si salva tutte le notizie già stampate..ma vorrei adottare questo tipo di soluzione solo in caso non ce ne fosse una più semplice e precisa.
    Quindi mi affido a voi..

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14
    non c'è soluzione?

  3. #3
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    non hai bisogno della subquery (che deve restituire una colonna ed un record), usa il limit
    http://dev.mysql.com/doc/refman/5.5/en/select.html
    ..
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    ...
    codice:
    SELECT *
    FROM notizie
    WHERE posizione_notizia=1    //posizione notizia=1 corrisponde alle notizie in primo piano
    ORDER BY data_notizia DESC 
    LIMIT 4;
    #restituisce i record 0->4
    SELECT *
    FROM notizie
    WHERE posizione_notizia=1    //posizione notizia=1 corrisponde alle notizie in primo piano
    ORDER BY data_notizia DESC 
    LIMIT 4,4;
    #restituisce i record 5->8

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14
    eh no,se leggi bene il problema è ben diverso,questo lo so già fare..
    ti spiego meglio con un esempio pratico,ho 10 notizie,queste notizie possono essere notizie
    di primo piano,di secondo piano,o semplici notizie.
    ho le seguenti notizie ordinate da 1 a 10 in base a DATA DESC
    NOTIZIA 1 primo piano
    NOTIZIA 2 secondo piano
    NOTIZIA 3 secondo piano
    NOTIZIA 4 primo piano
    NOTIZIA 5 primo piano
    NOTIZIA 6 secondo piano
    NOTIZIA 7 primo piano
    NOTIZIA 8 primo piano
    NOTIZIA 9 primo piano
    NOTIZIA 10 secondo piano

    in questo caso, in primo piano deve stamparmi
    NOTIZIA 1,4,5,7
    in secondo piano deve stamparmi
    NOTIZIA 2,3,6,8

    cioè stamparmi le ultime 4 notizie di primo piano e secondo piano inserite,ma non deve prendere le prime 4 notizie di primo piano.
    Spero di essere stato chiaro..

  5. #5
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Originariamente inviato da zuswin
    in questo caso, in primo piano deve stamparmi
    NOTIZIA 1,4,5,7
    in secondo piano deve stamparmi
    NOTIZIA 2,3,6,8

    cioè stamparmi le ultime 4 notizie di primo piano e secondo piano inserite,ma non deve prendere le prime 4 notizie di primo piano.
    Spero di essere stato chiaro..
    ah ok, sorry
    non so se è la soluzione a cui accennavi e che già adotti:
    codice:
    SELECT *
    FROM notizie
    WHERE posizione_notizia>0 AND id NOT IN(1,4,5,7)
    ORDER BY data_notizia DESC 
    LIMIT 4;
    la stringa da passare al NOT IN te la costruisci mentre cicli il primo result set

    Prova a fare dei test con questa, al momento sono impossibilitato:
    codice:
    SELECT *
    FROM notizie
    WHERE posizione_notizia = 2 OR
        (posizione_notizia = 1 AND data_notizia < (SELECT data_notizia FROM notizie WHERE posizione_notizia = 1 ORDER BY data_notizia DESC LIMIT 3,1))
    ORDER BY data_notizia DESC 
    LIMIT 4;

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14
    grazie è perfetta..ora vedo se trovo una soluzione del genere per il secondo problema che avevo posto,poi ti farò sapere se ho bisogno di aiuto..
    Comunque ovviamente il problema non è quello di mostrare le 4 notizie in secondo piano,ma è quello di mostrare diciamo le notizie in 3 piano.. In terzo piano dovrei mostrare ben 30 notizie,divise in 15 per colonna.. nella prima colonna stampo 15 notizie di un certo argomento,nella seconda le 15 notizie di un altro argomento (Es. Cronaca prima colonna Sport seconda colonna). Ragioniamo per risolvere una sola colonna,visto che il problema della seconda è identico. La colonna "Cronaca" deve stamparmi le ultime 15 notizie di "tipo_notizia='Cronaca'" che non sono state stampate ne in primo piano,ne in secondo piano. Quindi anche qui mi servirebbe una subquery contenente limit.. Non so come risolvere questo problema..qualcuno può aiutarmi? Potrei creare un array che si salva tutte le notizie già stampate..ma vorrei adottare questo tipo di soluzione solo in caso non ce ne fosse una più semplice e precisa. Quindi mi affido a voi..
    ancora grazie..

  7. #7
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Originariamente inviato da zuswin
    grazie è perfetta..ora vedo se trovo una soluzione del genere per il secondo problema che avevo posto,poi ti farò sapere se ho bisogno di aiuto..


    ancora grazie..
    prego, ma allora credo che l'approccio più semplice sia crearti un array con gli id già pubblicati, ti faccio un esempio spiccio in php (non avendo visto una riga di codice, non so se è applicabile ):
    codice:
    $res_primo_piano=mysql_query("...") or die();
    while($riga_primo_piano=mysql_fetch_assoc($res_primo_piano)){
    .....
    $id_pubblicato[]=$riga_primo_piano['id'];
    }
    
    $res_secondo_piano=mysql_query('... WHERE id NOT IN('.implode(',',$id_pubblicato).')') or die();
    while($riga_secondo_piano=mysql_fetch_assoc($res_secondo_piano)){
    .....
    $id_pubblicato[]=$riga_secondo_piano['id'];
    }
    
    $res_terzo_piano=mysql_query('... WHERE id NOT IN('.implode(',',$id_pubblicato).')') or die();
    while($riga_terzo_piano=mysql_fetch_assoc($res_terzo_piano)){
    .....
    $id_pubblicato[]=$riga_terzo_piano['id'];
    }
    etc. etc. etc.
    son 3 query contro 3 query di cui 2 con subquery (~5 query)

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14
    grazie mille,ho risolto cosi
    codice:
    SELECT *
        FROM notizia
        WHERE stato=0 AND tipo_notizia=$tipo AND
        (posizione_notizia=0 OR
        (posizione_notizia=2 AND data_notizia < (
        SELECT data_notizia
        FROM notizia
        WHERE stato=0 AND (posizione_notizia=2 OR (posizione_notizia=1 AND data_notizia < (SELECT data_notizia
                FROM notizia
                WHERE stato=0 AND posizione_notizia=1
                ORDER BY data_notizia DESC
                LIMIT 3, 1)))
    ORDER BY data_notizia DESC
    LIMIT 3,1
        )) OR (posizione_notizia=1 
        AND data_notizia < (
        SELECT data_notizia
        FROM notizia
        WHERE stato=0 AND (posizione_notizia=2 OR (posizione_notizia=1 AND data_notizia < (SELECT data_notizia
                FROM notizia
                WHERE stato=0 AND posizione_notizia=1
                ORDER BY data_notizia DESC
                LIMIT 3, 1)))
    ORDER BY data_notizia DESC
    LIMIT 3,1
        ) AND data_notizia <(
        SELECT data_notizia
                FROM notizia
                WHERE stato=0 AND posizione_notizia=1
                ORDER BY data_notizia DESC
                LIMIT 3, 1)
    ))
        ORDER BY data_notizia DESC
        LIMIT 15
    $tipo rappresenta il tipo di notizia da stampare..cronaca vale 1? allora passo 1 alla funzione che contiene questa query.
    stato invece risulta essere uguale a 0 quando la notizia è attiva e non è stata disattivata dall'amministratore.
    Ho usato il procedimento che mi hai suggerito prima,con i seguenti accorgimenti:
    se è una notizia di secondo piano,allora basta controllare che la sua data
    sia maggiore dell'ultima data delle notizie di secondo piano postate.Se è di primo piano invece va controllato sia se la notizia è stata postata prima del ultima notizia in secondo piano,e sia se è stata postata dopo l'ultima notizia del primo piano.
    Grazie ancora

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    14
    scusa,ho un piccolo dubbio..
    viste le query che abbiamo scritto,e visto che alla fine usano due date per svolgere tutto il loro lavoro,mi conviene salvare le due date in due variabili?cioè alla fine se ho capito bene,per ogni notizia,la query richiama altre 3 query,e se le notizie sono tante,il sito con il tempo rallenterebbe di molto,no?quindi mi conviene salvare le date,giusto?
    ----
    FaTTO

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.