• User Attivo

    annn ho capito...

    però mi da errore sul phpmyadmin:

    #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 'WHERE A.ID=B.ID_ARTICOLO' at line 13

    forse è la mia versione di php?

    bho!


  • User Attivo

    Cmq sia...

    ho quasi risolto; ho scritto:

    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 non mi prende l'ultima foto, bensì la prima...

    Il GROUP BY tiene buono il primo risultato, gli altri li esclude, che voi sappiate c'è il sistema per farlo funzionare al contrario?

    grazie infinite a tutti
    siete gentilissimi
    buona serata


  • 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.