Query 'nidificate' mysql

di il
17 risposte

Query 'nidificate' mysql

Spiego quello che vorrei fare...

Cerca nel database tutte le persone nate tal giorno. E fin li ci arrivo....

A quel punto ho una serie di query già  testate da sole e funzionanti sulla singola persona per ricavare dati aggiuntivi su quella persona.

Quello che proprio non riesco a fare è  far funzionare le stesse query sulla tutta lista di persone della prima query.

Non pretendo un codice paro paro, mi basterebbe il metodo ... mi fareste un favore immenso

 Grazie!

17 Risposte

  • Re: Query 'nidificate' mysql

    Database System Concepts - 2020, McGraw Hill

    Learning MySQL- 2021, O'Reilly

  • Re: Query 'nidificate' mysql

    2 volumi interessanti. Ora devo solo scegliere se leggermi quelli o solo tra le righe della tua risposta ??

  • Re: Query 'nidificate' mysql

    31/05/2023 - migliorabile ha scritto:


    Database System Concepts - 2020, McGraw Hill

    Learning MySQL- 2021, O'Reilly

    Hahahahahahahahaha….

    Magari la scritta “messaggio pubblicitario”.

    Trovi sul web select di select…

    Sarebbe bello vedere le query e la macroquery in questione.

    Comunque, se il problema è la data di nascita, basta aggiungere la condizione alle query che hai fatto, magari con passaggio di parametri. Ecco da dove cominciare la ricerca…

  • Re: Query 'nidificate' mysql

    Macroquery è adattissimo come termine. Talmente lunga e contorta che evito di postarla, però  approfondisco il concetto...

    Prima query funzionante stand-alone, con risultato a vista:

    Oggi è nato Gianni

    Oggi è nato Simone

    Oggi è  nata Nina....

    Secondo blocco di macroquery, anche quello funzionante se preso da solo. Cerca una cosa in comune tra una persona specificata del database e un fantomatico Antonio ( anche lui nel DB)   

    Risultato esempio: Gianni e Antonio hanno in comune una scarpa...

    Quello che vorrei risultasse:

    Oggi è nato Gianni

    (Gianni è Antonio hanno in comune una scarpa)

    Oggi è nato Simone

    (Simone e Antonio hanno in comune un neurone)

    ....

    Quello che ho fatto è 'infilare' il secondo blocco di query dentro il ciclo while della prima query 

    sperando che fatto il primo confronto tra Gianni e Antonio 'tornasse indietro' a completare il ciclo.

    Il risultato invece è  che si ferma al primo confronto, come se la prima query non fosse stata scritta...

    Ripeto, mi basterebbe il concetto, poi sul codice ci perdo tempo io! ??

  • Re: Query 'nidificate' mysql

    Beh, una domanda vaga merita risposte vaghe…

    Suppongo che la query “complessa” sia del tipo:

    Select * from nominativi where nominativi.datanascita='gg/mm/aaa'

    L'altra sarebbe tipo 

    select * from nominativi

    Left join caratteristiche on nominativi.idnominativo=caratteristiche.idnominativo

    Where caratteristiche.scarpa=42

    And caratteristiche.capelli="castano"

    Considera che la prima è superflua perché nella seconda query puoi inserire alche la condizione

    “And nominativi.datanascita=bla bla bla…”

    Ma diventerebbe complicatissimo. 

    Se ti confondi così dubito che possa aiutarti una lettura.

    Se posti almeno le miniquery “complesse” magari ti possono indicare dove sbagli… e come strutturare la query che ingloba le varie select.

    A questo punto do ragione a migliorabile, sono query semplici, ma se tu le reputi complesse e complicate allora sarebbe interessante dare uno sguardo alle tabelle per capire come sono organizzati i dati.

    Magari spiegherebbe la tua affermazione:

    tutta lista di persone della prima query

    Se una query estrapola tutti non è più una query ma una view.

    Forse vorresti contare quanti i nati in quel giorno hanno i capelli rossi, quanti sono maschi, quanti pesano meno di 3 kg ecc…

    Ma la sfera magica non funziona, quindi sarebbe il caso di vedere tabelle e query.

  • Re: Query 'nidificate' mysql

    Beh, una domanda vaga merita risposte vaghe…

    Pensa che da ignorante pensavo fosse una domanda chiara e circostanziata :-)

    …A questo punto do ragione a migliorabile, sono query semplici, ma se tu le reputi complesse e complicate allora sarebbe interessante dare uno sguardo alle tabelle per capire come sono organizzati i dati.

    Eh già, mi aveva inquadrato subito… Per non trovare domande stupide come la mia sui forum dovrebbe esserci per tutti un test di ingresso, ma pensa poi la noia…tutti che sanno tutto. Comunque per facilitarvi il lavoro quando ho tempo semplifico le query, accertandomi comunque che restino non funzionanti, e poi le posto . Per ora Grazie!

  • Re: Query 'nidificate' mysql

    31/05/2023 - Scevro ha scritto:


    Quello che ho fatto è 'infilare' il secondo blocco di query dentro il ciclo while della prima query 

    sperando che fatto il primo confronto tra Gianni e Antonio 'tornasse indietro' a completare il ciclo.

    Il risultato invece è  che si ferma al primo confronto, come se la prima query non fosse stata scritta...

    Ripeto, mi basterebbe il concetto, poi sul codice ci perdo tempo io! ??

    Non so che versione stai utilizzando di MySQL, ma in questi casi - magari smentirai eventualmente riportando anche però la query e le tabelle coinvolte con precisione - potrebbe tornare utile l'uso di CTE (Common Table Expressions).

    Leggi questo articolo per sapere di cosa si tratta e vedere qualche esempio.

  • Re: Query 'nidificate' mysql

    Grazie Alka! intanto provo a spiegarmi meglio con questo ….

    
    <?php
    $oggi = date('d-m');
    $anno = date('Y');
    $mysqli = mysqli_connect($host, $user, $password, $database);
    if ($mysqli===false){
    die("errore di connessione: " .$mysqli->connect_error);}
    else{
    
    $query1 = "SELECT * FROM generale WHERE DATE_FORMAT(nascita, '%d-%m') = '".$oggi."'";   //apre la prima query
    if($result = $mysqli->query($query1)){ 
    if($result->num_rows>0){
    
    while($row = $result->fetch_array()){   
    $codice=$row['codice'];        //codice del nato oggi
    $mestiere=$row['mestiere'];    //mestiere del nato oggi
    $nome=$row['nome'];            //nome del nato oggi
    // qui visualizzerebbe la lista completa dei nati oggi...
    echo " ... ".$nome." fa il ".$mestiere.") <br> ";
    $codx='Antonio';
    $cody=$codice; //
    //qui sotto la lista delle query secondarie
    $query2  = "SELECT * from generale WHERE codice='" . $codx . "'";  //apre Query su Antonio
    if($result = $mysqli->query($query2)){
    if($result->num_rows>0){
    while($row = $result->fetch_array()){
    //////////////////////////////////////
    //  Impostazioni variabili $query2 ///
    //////////////////////////////////////
    } 
    } 
    else{ }
    } 
    else{ }
    $query3  = "SELECT * from generale WHERE codice='" . $cody . "'";  //apre Query sul nato oggi
    if($result = $mysqli->query($query3)){
    if($result->num_rows>0){
    while($row = $result->fetch_array()){
    ///////////////////////////////////////
    //  Impostazioni variabili $query3 ////
    ///////////////////////////////////////
    } 
    } 
    else{ }
    } 
    else{ }
    
    for($z = 1; $z < 30; $z++){
    ///////////////////////////////////
    //  INSERIMENTO DATI ciclo FOR ////
    ///////////////////////////////////  
    }
    // qui il testo che dovrebbe ripetersi sotto ogni nato oggi, ma che invece si limita alla prima sola persona trovata...
    echo "..................... ";
    
    }  // chiude ciclo while della ricerca dei nati oggi
    } 
    else{}
    } 
    else{echo"problemi di connessione";}
    $mysqli->close();
    ?>
  • Re: Query 'nidificate' mysql

    31/05/2023 - Scevro ha scritto:


    Beh, una domanda vaga merita risposte vaghe…

    Pensa che da ignorante pensavo fosse una domanda chiara e circostanziata :-)

    …A questo punto do ragione a migliorabile, sono query semplici, ma se tu le reputi complesse e complicate allora sarebbe interessante dare uno sguardo alle tabelle per capire come sono organizzati i dati.

    Eh già, mi aveva inquadrato subito… Per non trovare domande stupide come la mia sui forum dovrebbe esserci per tutti un test di ingresso, ma pensa poi la noia…tutti che sanno tutto. Comunque per facilitarvi il lavoro quando ho tempo semplifico le query, accertandomi comunque che restino non funzionanti, e poi le posto . Per ora Grazie!

    Vago nel senso che non vedendo query, non vedendo tabelle e loro campi, non sapendo che relazioni hai impostato tra le tabelle, posso affermare che la domanda è indecifrabile dal punto di vista informatico.

    Esempio: non riesco a mettere in relazione la tabella persone con la tabella magazzino… cioè vorrei sapere quale fornitore mi fornisce gli articoli che vendo ai clienti alti due metri e che hanno figli minori con reddito incapiente… beh, si apre un mondo!

    Saluti.

  • Re: Query 'nidificate' mysql

    Semplifico il tutto. Perchè questa query  mi da' questo risultato

    <?php
    $oggi = date('d-m');
    $anno = date('Y');
    $mysqli = mysqli_connect($host, $user, $password, $database);
    if ($mysqli===false){
    die("errore di connessione: " .$mysqli->connect_error);}
    else{
    $query1 = "SELECT * FROM generale WHERE DATE_FORMAT(nascita, '%d-%m') = '".$oggi."'";   //apre la prima query
    if($result = $mysqli->query($query1)){ 
    if($result->num_rows>0){
    while($row = $result->fetch_array()){   
    $codice=$row['codice'];        //codice del nato oggi
    $mestiere=$row['mestiere'];    //mestiere del nato oggi
    $nome=$row['nome'];            //nome del nato oggi
    // qui visualizzerebbe la lista completa dei nati oggi...
    echo " ... ".$nome." fa il ".$mestiere.") <br> ";
    }  } 
    else{}
    } 
    else{echo"problemi di connessione";}
    $mysqli->close();
    ?>
    _______________________________________________
    Risultato :
    ...Giuseppe fa il falegname
    ...Antonio fa il postino
    ...Luigi fa il programmatore
    ............

    e se inserisco una query nel mezzo del ciclo while della prima query, mi da questo??

    <?php
    $oggi = date('d-m');
    $anno = date('Y');
    $mysqli = mysqli_connect($host, $user, $password, $database);
    if ($mysqli===false){
    die("errore di connessione: " .$mysqli->connect_error);}
    else{
    $query1 = "SELECT * FROM generale WHERE DATE_FORMAT(nascita, '%d-%m') = '".$oggi."'";   //apre la prima query
    if($result = $mysqli->query($query1)){ 
    if($result->num_rows>0){
    while($row = $result->fetch_array()){   
    $mestiere=$row['mestiere'];    //mestiere del nato oggi
    $nome=$row['nome'];            //nome del nato oggi
    // qui visualizzerebbe la lista completa dei nati oggi...
    echo " ... ".$nome." fa il ".$mestiere.") <br> ";
    $query2  = “SELECT * from generale WHERE codice='pippo';   // una query qualsiasi…
    if($result = $mysqli->query($query2)){
    if($result->num_rows>0){
    while($row = $result->fetch_array()){
    echo “”;
    }  } 
    else{}
    } 
    else{echo"problemi di connessione";}
    
    }  } 
    else{}
    } 
    else{echo"problemi di connessione";}
    $mysqli->close();
    ?>
    _______________________________________________
    Risultato :
    ...Giuseppe fa il falegname
    
  • Re: Query 'nidificate' mysql

    Ora capisco il termine “nidificare”.

    Dai un bel colpo di lavasciuga.

    1) se la select nati oggi è vuota fermati altrimenti prosegui. 

    E qui magari va bene se vuoi che php mostri l'elenco dei nati oggi.

    Ma poi prosegui per fare cosa? ti vai a cercare i campi in comune facendo una nuova select per mestieri e vai di ciclo while???

    Ti ho scritto un esempio logico testuale di come andare a creare la query e tu che fai? N query e spulci rigo dopo rigo i vari record sperando di trovare collegamenti???

    Hai dimenticato la scritta “attendere prego…”

    Vai su mysql, entri nel db, apri l'editor sql e cominci a scrivere una query con le join table.

  • Re: Query 'nidificate' mysql

    31/05/2023 - Scevro ha scritto:


    e se inserisco una query nel mezzo del ciclo while della prima query, mi da questo??

    Mai fare query nei cicli in quel modo: è totalmente inefficiente, al punto che anche con pochi utenti si rischia di inginocchiare il database, fermo restando che il codice diventa complesso e pure abbastanza inutile.

    Poi non capisco il codice PHP: va bene che la query produca risultati da usare in una pagina, ma qui ci stavamo concentrando su una query SQL, quindi parliamo di quella e il resto del codice che ne fa uso verrà scritta di conseguenza per sfruttarne i risultati, una volta che questi sono quelli giusti.

    Ergo, come ha suggerito lo stesso sishandrea, affrontiamo codice che può essere scritto nell'editor SQL e partiamo da quello, dall'obiettivo e dalla struttura di quello che viene messo in relazione.

  • Re: Query 'nidificate' mysql

    Mai fare query nei cicli in quel modo: è totalmente inefficiente, al punto che anche con pochi utenti si rischia di inginocchiare il database, fermo restando che il codice diventa complesso e pure abbastanza inutile.

    Mi basta questo. Il mio obiettivo era quello di farmi tornare buone una serie di querys, già perfettamente testate e funzionanti sul singolo e a cui non mi va di rinunciare, anche su una lista di persone. Adesso che so che non era la strada giusta mi rassegno, cercherò una strada alternativa, anche se più brutta, lunga e piena di curve…

    Poi non capisco il codice PHP: 

    pensa che ho sempre fatto tutto da lì, l'editor SQL mai usato! comunque grazie a tutti lo stesso!!

  • Re: Query 'nidificate' mysql

    E pensa che io faccio tutto con delphi…

    Tu in pratica non sfrutti mysql. Pensa che una query fatta bene ti evita tutti quegli if on if, while for e case of…

    In pratica hai un accendino e strofini i legnetti per ottenere il fuoco? Beh, se proprio ti vuoi male….

    Certo, è possibile risolvere un problema con le 4 operazioni matematiche, quindi perché sforzarsi di capire l'uso dei sistemi di equazioni…

    Studia mysql e vedrai il mondo con occhi diversi, non è un rimprovero ma un consiglio se vuoi perseguire in questo campo… ma tu magari piuttosto che php preferisci il linguaggio macchina, giusto per farsi del male.

    Studia sql, non te ne pentirai e domani la ramanzina la farai tu.

    Ora capisci perché risultavi vago?

Devi accedere o registrarti per scrivere nel forum
17 risposte