Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    SELECT ordinata tra due (o più) tabelle

    Ciao a tutti

    Ho un dubbio che credo molti si siano trovati ad affrontare, per cui vorrei capire quali siano le possibili soluzioni.

    Ho un classico database con due tabelle in relazione 1-N. Devo estrarre alcuni record dalla tabella 1 e, per ciascuno di essi, tutti i corrispondenti record "figli" nella tabella 2. Poi mostrare i risultati su una tabella HTML, ordinati e raggruppati in base ai record della tabella 1.

    Per come la vedo io, ci sono 3 possibili soluzioni:

    1. Fare una SELECT su tabella 1 e per ciascun record, da PHP fare una ulteriore SELECT su tabella 2. Questa soluzione è sicuramente la meno scalabile e quella con le peggiori performance, ma l'ho inclusa per completezza.

    2. Fare una JOIN su entrambe le tabelle. Scalabilissima e performante, comporta però che il raggruppamento dei record vada fatto via PHP con un meccanismo del tipo "imposta variabile temporanea con l'ID del record e finchè non cambia mostra le righe come sotto-record". Poco "elegante" dal punto di vista della programmazione.

    3. Fare una SUB-QUERY in cui, per ciascun record di tabella 1, i corrispondenti di tabella 2 vengano ritornati come array. In pratica:

    Tabella_1 - Record_1 - Campo_1
    Tabella_1 - Record_1 - Campo_2
    Tabella_1 - Record_1 - Sottorecord
    --- Tabella_2 - Record_N
    --- --- Tabella_2 - Record_N - Campo1
    --- --- Tabella_2 - Record_N - Campo2
    --- Tabella_2 - Record_K
    --- --- Tabella_2 - Record_K - Campo1
    --- --- Tabella_2 - Record_K - Campo2

    In questo modo, nel codice PHP non ci sarebbe bisogno di fare continuamente controlli ma basterebbe un ciclo secondario dentro il ciclo principale. Mi chiedo: è possibile creare una query MySQL che dia questo risultato?

    Grazie a tutti, a presto!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    io farei tutto con una sola query in un colpo solo

    con un qualcosa di questo tipo

    codice:
    select 
    tabella1.id,
    tabella2.id,
    tabella2.item,
    tabella2......
    from tabella2
    left join tabella1 on tabella1.id=tabella2.idtabella1
    order by tabella1.id,tabella2.id
    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da 123delphi321
    io farei tutto con una sola query in un colpo solo

    con un qualcosa di questo tipo

    codice:
    select 
    tabella1.id,
    tabella2.id,
    tabella2.item,
    tabella2......
    from tabella2
    left join tabella1 on tabella1.id=tabella2.idtabella1
    order by tabella1.id,tabella2.id
    ciao
    non una gran soluzione, in realtà, è il punto "2".

  4. #4
    sarà una "schifezza", ma il punto 2 risponde alla pratica corrente: l'estrazione dei dati compete al db, la presentazione al programma

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Avere i dump delle tabelle sarebbe stato utile, ma tant'è.

    Facciamo un esempio simile al tuo caso:
    2 tabelle: CLIENTI e RECAPITI
    tabella CLIENTI: IDcliente, Cognome, Nome
    tabella RECAPITI: IDRecapito, IDCliente, Valore
    (per Valore si intende la stringa del recapito, es. l'indirizzo, oppure il telefono, etc...)

    Le tabelle sono 'relazionate' sul campo IDCliente
    Premesso che per ogni cliente (in CLIENTI) possono essere presenti o meno dei Recapiti (in RECAPITI), la query sottostante mostrerà per ogni cliente il rispettivo elenco dei recapiti:

    codice:
    select idcliente, cognome, nome, valore from 
    (
    select idcliente, cognome, nome, '' as valore  from clienti 
    UNION
    select idcliente, '' as cognome, '' as nome, valore from recapiti
    )
    order by 1,4
    la soluzione la vedi nell'immagine allegata.
    Mi pare che la tua esigenza sia più o meno quella.

    Immagini allegate Immagini allegate

  6. #6
    gibra, anche con la tua soluzione scitrek deve tribolare per intabellare i risultati. tanto vale fare una select normale e gestire il cambio di riferimento (una IF, mica la morte...)

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.