Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26

Discussione: Join consiglio

  1. #1

    Join consiglio

    Salve ho in un db di annunci alcune tabelle :

    Comuni -> id,id_provincia,comune
    Provincie-> id,provincia
    user-> diversi campi ma mi serve solo il comune (citta nel db)
    annunci -> devo recuperare tutto qui ho l'id_user

    HO proceduto così ma mi sto incartando vorrei recuperare tutti i campi dell'annuncio e ilcomune dagli user per la visualizzazione , ho commentato anche il codice :

    codice:
    if(isset( $_POST['provincia'])){
         $provincia=$_POST['provincia'];
         //recupero il record della provincia seleionata
         $sql="SELECT id,provincia FROM province where provincia='$provincia'";
         echo '<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>Sql:'.$sql;
         $result=mysql_query($sql);
         $prov=mysql_fetch_assoc($result);
         //recupero l'id della provincia
         $idprov=$prov['id'];
         echo 'idprov:'.$idprov;
    
    
         //recupero tutti i comuni della provincia
         $sql2    = "SELECT id,id_provincia FROM comuni where id_provincia='$idprov'";
         $result2 = mysql_query($sql2);
         //creo un array con tutti gli id dei comuni
         $arraycomuni=array();
         //scorro i risultati e inserisco nell'array gli id dei comuni
         while ($row=mysql_fetch_assoc($result2)) {
             
    
    
             array_push($arraycomuni, $row['id']);
    
    
    
    
         }
    
    
         //Creo un array per inserire tutti gli user  dei comuni della provincia
         $arrayuser=array();
    
    
         //scorro i risultati e inserisco nell'array tutti gli user di quella provincia
         foreach ($arraycomuni as $k => $v) {
             
             $sql3    = "SELECT citta,id FROM user WHERE citta='$v'";
             $result3 = mysql_query($sql3);
             
             while ($row=mysql_fetch_assoc($result3)) {
                 array_push($arrayuser, $row['id']);
             }
    
    
         }
    
    
         //creo un array per inserire tutte le offertedella provincia
         //scorro i risultati e controllo le offerte attive degli user della provincia
         //e le inserisco in un array
         $arrayofferte= array();
         foreach ($arrayuser as $k => $v) {
             
             $sql4    = "SELECT  offerte.* ,user.citta FROM offerte,user  WHERE iduser.offerte='$v' AND attiva=1 ORDER BY DATA ASC";
             $result4 = mysql_query($sql4);
             
             while ($row=mysql_fetch_assoc($result4)){
                 array_push($arrayofferte, $row['id']);
          array_push($arraycomuniuser,$row['citta']);
             }
    
    
         }
    
    
    
    
    
    
      
    
    
    
    
     }
    Ma il risultato sono tantissimi record ma tanti con risultati doppioni per alcuni campi .esiste un modo migliore?

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    523
    prova la query sottostante, dovrebbe sostituire una buona parte del codice,
    poi la stessa logica la applichi alle query successive presenti nel tuo codice
    codice:
    SELECT DISTINCT citta, id FROM user WHERE citta in ( 
    SELECT id FROM comuni WHERE id_provincia in ( 
    SELECT id FROM province WHERE provincia='$provincia' ) )
    ps, ho usato i nomi presenti nelle tue query, spero di non aver fatto confusione con gli "id"

  3. #3
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    la query precedente è inefficiente per le versioni più vecchie di mysql conviene controllare explain

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    523
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    la query precedente è inefficiente per le versioni più vecchie di mysql conviene controllare explain
    quanto inefficiente ? nanosecondi ?

  5. #5
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Quote Originariamente inviata da marino51 Visualizza il messaggio
    quanto inefficiente ? nanosecondi ?
    a seconda della versione anche centinaia di volte più lenta del join, secondi contro millisecondi.

  6. #6
    Puoi spiegarmi la query , a me sembra funzionale , il sito è nuovo , cosaintendi per versioni vecchie di sql ?

    dovrebbe eliminare questo codice :

    codice:
    //recupero il record della provincia seleionata
         $sql="SELECT id,provincia FROM province where provincia='$provincia'";
         echo '<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>Sql:'.$sql;
         $result=mysql_query($sql);
         $prov=mysql_fetch_assoc($result);
         //recupero l'id della provincia
         $idprov=$prov['id'];
         echo 'idprov:'.$idprov;
    
    
         //recupero tutti i comuni della provincia
         $sql2    ="SELECT id,id_provincia FROM comuni where id_provincia='$idprov'";
         $result2 = mysql_query($sql2);
         //creo un array con tutti gli id dei comuni
         $arraycomuni=array();
         //scorro i risultati e inserisco nell'array gli id dei comuni
         while($row=mysql_fetch_assoc($result2)){
             
    
    
             array_push($arraycomuni, $row['id']);
    
    
    
    
         }
    
    
         //Creo un array per inserire tutti gli user  dei comuni della provincia
         $arrayuser=array();
    
    
         //scorro i risultati e inserisco nell'array tutti gli user di quella provincia
         foreach($arraycomuni as $k => $v){
             
             $sql3    ="SELECT citta,id FROM user WHERE citta='$v'";
             $result3 = mysql_query($sql3);
             
             while($row=mysql_fetch_assoc($result3)){
                 array_push($arrayuser, $row['id']);
             }
    
    
         }
    Qui come risultato ho l'id user e l'id del comune ....ora vorrei poter trovare gli annunci di questo user conservando però l'id del comune (meglio sarebbe il nome)

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    523
    La query sostituisce la parte di codice che hai evidenziato,

    certo, con rispetto all'appunto di MySQL sulla velocità di risposta, è necessario che i campi di ricerca siano indicizzati

    in particolare devi indicizzare,
    id della provincia che si trova nella tabella comuni,
    id del comune che si trova nella tabella user
    poi se vuoi strafare puoi indicizzare anche la "provincia" con cui fai la ricerca nella tabella provincie
    in questo modo dai efficienza alle ricerche

    la query che ti ho indicato estrae "citta" e "id" dello user, come la tua originale,
    ma puoi aggiungere altre info sempre della tabella user

    la query estrae i record da "user",
    verificando che siano presenti nei risultati delle select "a monte"

    cerca solo di aggiungere al tuo db gli indici che ti ho indicato

  8. #8
    Ringraziandoti per ora il risultato finale dovrebbe essere quello di estrarre dal DB tutti gli annunci della provincia , secondo te e possibile creare una sola query in cui ho tuttii campi degli annunci e il nome del comune?

  9. #9
    Ma una roba del genere?

    codice:
    SELECT a.campo1, a.campo2, ..., a.campoN, c.comune 
    FROM comuni c, provincie p, user u, annunci a 
    WHERE p.provincia = '$provincia' AND c.id_provincia = p.id AND c.comune = u.comune
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    Quote Originariamente inviata da satifal Visualizza il messaggio
    Ma una roba del genere?

    codice:
    SELECT a.campo1, a.campo2, ..., a.campoN, c.comune 
    FROM comuni c, provincie p, user u, annunci a 
    WHERE p.provincia = '$provincia' AND c.id_provincia = p.id AND c.comune = u.comune
    HO utilizzato questa di prova direttamente in phpmyadmin :
    codice:
    SELECTa.*,p.provincia,c.comune,c.idasid_comuneFROMcomunic,provincep,useru,annunciaWHEREp.provincia='Firenze'ANDa.attiva=1AND c.comune=u.citta


    Il risultato sono 6 milioni di colonne con tutti i comuni(mentre vorrei solo quelli della provincia di firenze) e gli annunci ripetuti molte volte.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.