Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di nep036
    Registrato dal
    Nov 2003
    Messaggi
    1,453

    Query complessa php/mysql

    Ciao a tutti, magari qualcuno più esperto di me nel campo può darmi qualche suggerimento.

    Ponendo il caso che ad un id di un record record ho associati più record in altre tabelle:

    per esempio ho un prodotto ed al suo id sono associate n immagini, n video, n commenti e cosi via...

    Nel momento in cui vado a pescare il record è possibile con una query unica pescare tutto insieme, quindi il mio prodotto con tutte le info associate oppure è meglio fare più query?

    Quindi pesco il prodotto, poi con l'id pesco tutte le immagini, video ecc con altre query...

    Qual'è la situazione più veloce e performante e quale situazione mi consigliereste?

    1000 grazie...


  2. #2
    Dipende da com'è strutturato il DB...

    Da come ho capito mi sembra che tu abbia una relazione uno a molti nel DB, quindi l'ideale sarebbe fare una left join in SQL... per estrarre subito tutti i dati relativi al prodotto.

    Successivamente con un ciclo for estrai tutte le info di cui necessiti.

    Se riporti la struttura esatta del db posso aiutarti a scrivere il codice SQL + PHP necessario
    <!-- Debian GNU/Linux 4.0 Kernel 2.6.x -->
    ftp://ftp.it.debian.org/
    http://www.php.net/

  3. #3
    Utente di HTML.it L'avatar di nep036
    Registrato dal
    Nov 2003
    Messaggi
    1,453
    Grazie!

    Allora io ho una tabella prodotti:

    id - nome - descrizione - etc

    poi ho una tabella multimedia con

    id - id_prodotto - file - etc

    poi una tabella commenti

    id - id_prodotto - id_user - messaggio -etc


    Come vedi il legame è id_prodotto, e come dici tu con un rapporto uno a molti, ed è questo che mi prende un attimo impreparato, fino ad oggi al limite ho usato join in rapporti uno a uno, ma adesso mi trovo un po imbrigliato a livello logico :-D ...

    ...grazie per la disponibilità, un esempio certo mi farebbe capire immediatamente, poi me la cavo..


  4. #4
    Originariamente inviato da nep036
    Grazie!

    Allora io ho una tabella prodotti:

    id - nome - descrizione - etc

    poi ho una tabella multimedia con

    id - id_prodotto - file - etc

    poi una tabella commenti

    id - id_prodotto - id_user - messaggio -etc


    Come vedi il legame è id_prodotto, e come dici tu con un rapporto uno a molti, ed è questo che mi prende un attimo impreparato, fino ad oggi al limite ho usato join in rapporti uno a uno, ma adesso mi trovo un po imbrigliato a livello logico :-D ...

    ...grazie per la disponibilità, un esempio certo mi farebbe capire immediatamente, poi me la cavo..

    Allora... questo è il caso in cui le sotto query introdotte con mysql 4.1 fanno veramente comodo .

    In pratica con la sotto query crei una tabella e successivamente, esegui il left join con la terza tabella. Mi spiego meglio, guarda il codice SQL:
    Codice PHP:
    SELECT FROM commenti LEFT JOIN (SELECT FROM prodotti LEFT JOIN multimedia ON prodotti.id=multimedia.id_prodotto) AS rlj ON commenti.id_prodotto=rlj.id_prodotto
    Questo codice dovrebbe fare quello che ti serve. Come puoi bene notare il tutto è fatto attraverso un'unica query.
    <!-- Debian GNU/Linux 4.0 Kernel 2.6.x -->
    ftp://ftp.it.debian.org/
    http://www.php.net/

  5. #5
    Utente di HTML.it L'avatar di nep036
    Registrato dal
    Nov 2003
    Messaggi
    1,453
    Grandioso, ma mi spiegheresti in pratica cosa succede e perchè peschi in quel determinato ordine?

    Cmq grazie mille, adesso faccio qualche test subito...



    PS

    Sai niente a livello di prestazioni se c'è un incremento o decremento rispetto a tre query in successione?

    Ah poi, nel caso nelle tabelle ci sono campi che hanno lo stesso nome una volta che ho il risultato come identifico le varie info?

  6. #6
    La query:
    Codice PHP:
    SELECT FROM prodotti LEFT JOIN multimedia ON prodotti.id=multimedia.id_prodotto 
    Crea una tabella, successivamente la seconda query:
    Codice PHP:
    SELECT FROM commenti LEFT JOIN (SELECT FROM prodotti LEFT JOIN multimedia ON prodotti.id=multimedia.id_prodotto) AS rlj ON commenti.id_prodotto=rlj.id_prodotto
    esegue una LEFT JOIN usando la tabella creata in precedenza.

    Rispetto alle query in successione, dovrebbe esserci un incremento leggero di prestazioni, poichè in questo modo stiamo sottoponendo il server ad una sola query un po' più complicata che esegue il tutto con un comando SQL unico.

    Se usiamo invece una serie di query, ogni volta il DMBS sarà costretto a creare delle tabelle più semplici sicuramente ma molto più lunghe. Per non parlare poi delle operazioni che dovrà fare php per elaborare i dati su queste tabelle, con i continui soket mysql che si aprono e si chiudono...

    In conclusione l'uso del comando join, nel nostro caso del left join, permette di sfruttare un sistema appositamente creato per questo genere di operazioni, sicuramente molto più performante rispetto alle altre soluzioni.

    Per quanto rigurda l'identificazione dei diversi dati puoi rinominare i campi usando AS nella query SQL.

    <!-- Debian GNU/Linux 4.0 Kernel 2.6.x -->
    ftp://ftp.it.debian.org/
    http://www.php.net/

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