Efficenza query...

Ciao, volevo sapere se la seguente query è efficente o se quando dovrò stampare gentinaia di giochi diventerà lentissima... e da meno di una settimana che ho messo mano alla programmazione ad oggetti (e anche ai database molti a molti) quindi mi sento un pò incasinato :D

Così com'e' funziona bene...

In poche parole ho un database con le seguenti tabelle: giochi, generi, generi_giochi, marche, marche_giochi

da questo incasinatissimo sistema di tabelle io ottengo i dati da stampare cosi:

EDIT1: Non so come mai è venuto incollato malissimo il codice, ho dato una piccola sistemata :|

<?php

$this->database->query("SET NAMES 'utf8'");
$query = $this->database->query("SELECT id_gioco, titolo_1, titolo_2, data, date_format(data, '%d/%m/%Y') as data FROM giochi");
         
   while ($dato = $query->fetch_object()) {
      $games_id = $dato->id_gioco;
      $titolo =   $dato->titolo_1;
            
      print "$titolo ";
            
      $query_2 = $this->database->query("SELECT generi.genere, marche.nome_marca
                               FROM generi, marche, generi_giochi, marche_giochi
                               WHERE generi.id_genere = generi_giochi.id_genere
                               AND   marche.id_marca = marche_giochi.id_marca
                               AND     marche_giochi.id_gioco = $games_id
                               AND     generi_giochi.id_gioco = $games_id") or die($this->database->error);
                                      
      while ($dati = $query_2->fetch_object()) {
            
      $nome_marca = $dati->nome_marca;
              print "$dati->genere ";
           }
              print " $nome_marca<br>";
      }

?>

Lasciate perdere il modo come le stampa, sistemerò dopo l'aspetto estetico :D

Ah le query le effettuo con $this->database->query ovviamente perchè all'interno della classe passo l'oggetto mysqli alla variabile $database :|

inviato 8 anni fa
eXile
modificato 8 anni fa
X 0 X

A prima vista la query sembra scritta bene. Se le condizioni di JOIN sono tra chiavi primarie delle diverse tabelle allora va ancora meglio.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Waa Gianni, risposta super immediata :D

Ottimo, ad un certo punto non ci stavo capendo piu nulla! Non so perchè cercavo di estrarre tutto in un colpo solo, ma poi ho pensato che forse era impossibile e quindi ho utilizzato le due query...

grazie della risposta :)

uff quanto odio questo forum che ogni volta dopo 2 minuti non mi fa editare piu  ;D

risposto 8 anni fa
eXile
modificato 8 anni fa
X 0 X

Aspetta... non conoscendo la struttura delle tabelle ed il numero di record estratti mi sono limitato a guardare le due query singolarmente, quindi non ti so dire se è più opportuno e fattibile fondere le due query.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

capisco, cmq è sorto un problema... se il titolo ha solo una marca e tanti generi va tutto bene, ma se metto 2 marche allo stesso gioco i generi vengono stampati raddoppiati: tipo horror horror, tragedia tragedia.

credo il problema sia a questo punto nella query ma non capisco dove.

Le tabelle sono cosi:

giochi: id_gioco(primary key), etc etc

generi: id_genere (primary key), genere

genere_giochi: id (primary key), id_gioco, id_genere

marche: id_marca(primary key), nome_marca

marche_giochi: id(primary key), id_gioco, id_marca

risposto 8 anni fa
eXile
X 0 X

facendo delle prove con num_rows, ho visto che quando stampa la prima riga (che ha una marca sola e tre generi), num rows restituisce 3 righe... e tutto funziona.

Quando invece prende la seconda riga, che ha due marche e tre generi... le righe diventano 6, e stampa i 3 generi due volte... Horror Horror, Avventura Avventura, Tragedia Tragedia.

risposto 8 anni fa
eXile
X 0 X

Ho finito con l'effettuare 3 query... una che mi estrae i dati del gioco, una i nomi dei generi e una i nomi delle marche... ora tutto funziona bene.

Sono curioso di sapere se è possibile effettuare una query  che mi permetta di risparmiare uno o due di questi passaggi... chessò ottenere i nomi delle marche e dei generi nello stesso passaggio... visto che la mia allegata in questo post non sembra funzionare se ci sono piu generi e piu marche contemporaneamente :)

risposto 8 anni fa
eXile
X 0 X

quando vai in JOIN su più tabelle, nel caso ci siano relazioni uno a molti (es.: un gioco, molte marche), è normale che avvenga la moltiplicazione dei record estratti e quindi la duplicazione di certe informazioni. Un JOIN è simile ad una moltiplicazione tra le righe di una tabella e quelle dell'altra. Le condizioni di JOIN e le WHERE filtrano i risultati di queste moltiplicazioni, che comunque sono destinati ad aumentare di numero ad ogni JOIN inserita nella query.

Chiarito quindi che non è possibile evitare il fenomeno, va detto però che si può aggirare applicativamente con PHP, semplicemente filtrando i risultati ottenuti dalla query, ovvero evitando con dei controlli (degli IF) di ripetere i dati già mostrati.

Il suddetto approccio comunque è valido quando si estraggono poche decine di record dal DB. Se invece il numero è molto superiore allora si costrinde il database ha cenerare una mole enorme di dati che per la maggior parte saranno duplicati e quindi scartati dal codice, con conseguente degrado delle prestazioni dell'applicativo. In fatti se una JOIN è generalmente più veloce di qualche query lanciata separatamente, con l'aumentare dei dati trattati si inverte il risultato.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ciao gianni, grazie per la risposta.

Dunque in questo caso, visto che il db deve estrarre tantissimi titoli, effettuare le 3 query come ho fatto io per ovviare al problema, è la soluzione piu giusta, no?

grazie ancora.

risposto 8 anni fa
eXile
modificato 8 anni fa
X 0 X

quante query lancerai in totale?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Beh in quella pagina solo quelle 3, La prima estrare i dati riguardanti il titolo (gioco\film) la seconda i generi del titolo, e la terza le marche se ne ha piu di una.

risposto 8 anni fa
eXile
modificato 8 anni fa
X 0 X
Beh in quella pagina solo quelle 3, La prima estrare i dati riguardanti il titolo (gioco\film) la seconda i generi del titolo, e la terza le marche se ne ha piu di una.

Sei sicuro che sono solo 3 query? Non è che una di queste viene eseguita iterativamente all'interno di un ciclo?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda