• User

    CORRETTO:

    Ci provo anch'io... c'è in ballo una pizza...
    Provata e funzionante,
    per Mysql:

    
    SELECT * FROM (
    SELECT A2.* FROM 
    (SELECT ID
    FROM ARTICOLI
    WHERE ARTICOLI.visibile="si"
    ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 WHERE A1.ID=A2.ID
    ) A LEFT JOIN (
    SELECT B2.* FROM
    (SELECT id_articolo, MAX(id) AS MAX_ID
    FROM FOTO
    GROUP BY ID_ARTICOLO) B1, FOTO B2
    WHERE B1.MAX_ID=B2.ID
    ) B ON A.ID=B.ID_ARTICOLO
    
    

    per MsAccess:

    
    SELECT * FROM (
    SELECT A2.* FROM 
    (SELECT TOP 3 ID
    FROM ARTICOLI
    WHERE ARTICOLI.visibile="si"
    ORDER BY DATA DESC) A1, ARTICOLI A2 WHERE A1.ID=A2.ID
    ) A LEFT JOIN (
    SELECT B2.* FROM
    (SELECT id_articolo, MAX(id) AS MAX_ID
    FROM FOTO
    GROUP BY ID_ARTICOLO) B1, FOTO B2
    WHERE B1.MAX_ID=B2.ID
    ) B ON A.ID=B.ID_ARTICOLO
    
    

    Ciao e alla prossima


  • User Attivo

    :():


  • User

    mi son dimenticato di indicare qual è la modifica.... "ON A.ID=B.ID_ARTICOLO" al posto di "WHERE A.ID=B.ID_ARTICOLO"


  • User Attivo

    Ciao OsteriaORistorante!

    ho scritto:

    SELECT * FROM (
    SELECT A2.* FROM
    (SELECT ID
    FROM ARTICOLI
    WHERE ARTICOLI.visibile="si"
    ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 ON A.ID=B.ID_ARTICOLO
    ) A LEFT JOIN (
    SELECT B2.* FROM
    (SELECT id_articolo, MAX(id) AS MAX_ID
    FROM FOTO
    GROUP BY ID_ARTICOLO) B1, FOTO B2
    WHERE B1.MAX_ID=B2.ID
    ) B ON A.ID=B.ID_ARTICOLO

    ma da errore:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6

    ma tu hai provato con la mia query?

    SELECT * FROM articoli LEFT OUTER JOIN foto ON articoli.id=foto.id_articolo WHERE visibile = 'si' GROUP BY id_articolo ORDER BY data DESC LIMIT 0, 3;

    l'unico problema è che prende la prima foto e non l'ultima, colpa del GROUP BY se non sbaglio,

    non si può dirgli in qualche modo "Ragruppa ma parti da in fondo"?

    grazie mille a tutti
    buona serata


  • User Attivo

    @enricocarli said:

    Ciao OsteriaORistorante!
    [...]
    ma da errore:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6
    [...]

    Vabbè... che dire... eeehhhhh... non tutte le ciambelle riescono col buco.... :bastard:
    Prova questo...
    [PHP]
    <?php
    require_once'connect.php';
    // recupero i singoli id_articolo delle foto
    $query = "SELECT DISTINCT foto.id_articolo FROM foto ORDER BY id_articolo DESC";
    $a = mysqli_query($conn, $query);
    // metto ogni id_articolo in un array
    while($r = mysqli_fetch_array($a)){
    $array[] = $r[0];
    }
    echo '<pre>'; // DEBUG (eliminare)
    var_dump($array); // DEBUG (eliminare)
    echo '</pre>'; // DEBUG (eliminare)
    $x = 0;
    $i = 0;

    while($i <= count($array)-1){ // faccio un ciclo su tutti i valori dell'array. Il ciclo si ferma all'esaurimento dell'array o al recupero di 3 articoli (riga 29)...

    $query2 = "SELECT foto.foto, h1, h2 FROM foto, articoli WHERE foto.id_articolo = '$array*' AND articoli.id = '$array*' AND articoli.visibile = 'si' ORDER BY foto.id DESC LIMIT 1";
    echo $query2 . '<br />'; // DEBUG (eliminare)
    $result = mysqli_query($conn, $query2);
    $i++; // passo al valore successivo dell'array
    if(mysqli_num_rows($result) == 0) continue;  // se con l'id_articolo non c'è un articolo "visibile" riprendo il ciclo da capo altrimenti proseguo...
    $x++; //... inserendo il primo articolo e aumentando il contatore
    while($row = mysqli_fetch_array($result)){
        echo "<h1>Articolo $x </h1>"; // DEBUG (eliminare)
        echo $row['foto'] . '<br />';
        echo $row['h1'] . ' ' . $row['h2'] . '<br />';
    }
    if($x == 3) break; // quando il contatore degli articoli recuperati arriva a 3 mi fermo
    

    }

    ?>
    [/PHP]
    Tonno e cipolla... grazie. :fumato:


  • User

    Ciao Enrico,
    tonno e cipolla non mi interessano... ma giusto per verifica, mi sembra che la query che hai eseguito tu rispetto a quella che ti ho indicato io, è diversa nella parte evidenziata..... mi sbaglio?

    quella da me indicata:
    SELECT * FROM (
    SELECT A2.* FROM
    (SELECT ID
    FROM ARTICOLI
    WHERE ARTICOLI.visibile="si"
    ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** WHERE A1.ID=A2.ID**
    ) A LEFT JOIN (
    SELECT B2.* FROM
    (SELECT id_articolo, MAX(id) AS MAX_ID
    FROM FOTO
    GROUP BY ID_ARTICOLO) B1, FOTO B2
    WHERE B1.MAX_ID=B2.ID
    ) B ON A.ID=B.ID_ARTICOLO

    Quella da te eseguita:
    SELECT * FROM (
    SELECT A2.* FROM
    (SELECT ID
    FROM ARTICOLI
    WHERE ARTICOLI.visibile="si"
    ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** ON A.ID=B.ID_ARTICOLO**
    ) A LEFT JOIN (
    SELECT B2.* FROM
    (SELECT id_articolo, MAX(id) AS MAX_ID
    FROM FOTO
    GROUP BY ID_ARTICOLO) B1, FOTO B2
    WHERE B1.MAX_ID=B2.ID
    ) B ON A.ID=B.ID_ARTICOLO

    riprova, sarai più fortunato.... e ahimè.. Oslino più sfortunato :andrez:

    Ciaue


  • User Attivo

    cheddire...

    molto bravi tutti e 2, complimenti davvero...

    se posso fare delle considerazioni, da principiante profano e impedito di php,

    è veramente interessante come con una query si possano incrociare dati e manipolarli così,

    parlo della query di OsteriaORistorante, che per quello che ne so io è veramente complessa...

    però sinceramente non ho capito come funziona, e non ho capito il discorso degli alias; me li puoi spiegare?

    Anche la soluzione di Oslino fa quello che deve fare è capisco a spanne come funziona, bravo Oslino!

    Grazie a tutti e 2 per la pazienza e il tempo dedicatomi,

    se capito a Milano o Rimini o capitate voi a Vicenza ve la offro la pizza :D:D:D:D:D

    Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?

    grazie ancora e buonanotte


  • User Attivo

    @enricocarli said:

    Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?
    Che domande... la migliore è sempre quella che fa la stessa cosa con minor codice (e sfruttando le caratteristiche intrinseche del linguaggio). :wink3:
    Ne guadagna anche la velocità di esecuzione e quindi la performance generale.


  • User Attivo

    annn...
    ok capisco!

    e come faccio a misurare le performance?


  • User Attivo

    @enricocarli said:

    e come faccio a misurare le performance?
    Non lo so come si potrebbe fare ma probabilmente non avrebbe neanche senso. Si parla di frazioni del millesimo di secondo impercettibili. Iniziano a diventare importanti e a vedersi rallentamenti quando si hanno migliaia di visitatori nello stesso momento.