Visualizzazione risultati 1 fino 3 di 3

Discussione: Select Join 1 a molti su una sola riga

  1. #1
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito Select Join 1 a molti su una sola riga

    Devo recuperare dei dati alcune tabelle in join.

    E fin qui nulla di strano.
    I dati sono ordinati secondo questo schema:

    Una tabella (ordini) che contiene i dati generali (nome, cognome, ecc), legata in join ad una tabella (righe). Ogni riga contiene i dati generali del prodotto (denominazione, prezzo, quantità, ecc).
    Le righe hanno anche una relazione con altre tabelle (una per prodotto) che contengono caratteristiche particolari sul prodotto.

    Quindi tra ordini e righe esiste una relazione uno a molti, tra righe e dettagli una relazione uno a uno.

    Eseguendo una Query, per ogni ordine, ottengo una riga per ogni prodotto.

    Ora, considerando che, per la situazione che sto esaminando, i prodotti possono essere al massimo 2 e che i dati da recuperare per ognuno sono pochi (del singolo prodotto mi serve il nome, mentre del dettaglio un solo campo), è possibile creare una query (o in alternativa una routine PHP) che mi ponga i record come 1 a 1 (1 ordine una riga)?
    Posso aggiungere che posso semplificare la cosa anche estraendo un ordine alla volta.

    Come potrei fare?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    è possibile creare una query che mi ponga i record come 1 a 1 (1 ordine una riga)?
    In breve, no: se fosse possibile ti ritroveresti una tabella le cui righe avrebbero un numero variabile di colonne, alcune con lo stesso nome.

    Però puoi realizzare ciò di cui hai bisogno in PHP. L'idea è di leggere i dati così come stai facendo ora, ottenendo un risultato di questo tipo (assumendo che la tabella ordini abbia una chiave primaria id):
    Codice:
    id | nome  | cognome | denominazione | prezzo | quantità | dettagli
     1 |   "A" |    "AA" |  "prodotto 1" |  10.00 |       50 |    "..."
     1 |   "A" |    "AA" |  "prodotto 2" |  15.00 |       20 |    "..."
     1 |   "A" |    "AA" |  "prodotto 3" |   9.00 |       10 |    "..."
     2 |   "B" |    "BB" |  "prodotto 1" |  17.00 |       35 |    "..."
     2 |   "B" |    "BB" |  "prodotto 2" |  19.00 |       27 |    "..."
     3 |   "C" |    "CC" |  "prodotto 1" |   5.00 |       13 |    "..."
    A questo punto puoi utilizzare la chiave primaria di ordini come indice di un vettore associativo di ordini. Il risultato da ottenere è questo (esemplificato in JSON):
    Codice:
    ordini = [
        {
            "id": 1,
            "nome": "A",
            "cognome": "AA",
            "prodotti": [
                {
                    "denominazione": "prodotto 1",
                    "prezzo": 10,
                    "quantità": 50,
                    "dettagli": "..."
                },
                {
                    "denominazione": "prodotto 2",
                    "prezzo": 15,
                    "quantità": 20,
                    "dettagli": "..."
                },
                {
                    "denominazione": "prodotto 3",
                    "prezzo": 9,
                    "quantità": 10,
                    "dettagli": "..."
                }
            ]
        },
        ...
        {
            "id": 3,
            "nome": "C",
            "cognome": "CC",
            "prodotti": [
                {
                    "denominazione": "prodotto 1",
                    "prezzo": 10,
                    "quantità": 50,
                    "dettagli: "..."
                }
            ]
        }
    ]
    Una possibile procedura, in pseudocodice:
    Codice:
    result = query("...")
    
    ordini = []
    foreach result as row:
        id = row['id']
        if !isset(ordini[id]):
            ordini[id] = [
                'nome' => row['nome'],
                'cognome' => row['cognome'],
                'prodotti' => []
            ]
        endif
        ordini[id]['prodotti'].push([
            'denominazione' => row['denominazione'],
            'prezzo' => row['prezzo'],
            'quantità' => row['quantità'],
            'dettagli' => row['dettagli'],
        ])
    endforeach
    PS: Dovresti valutare i nomi che hai dato alle tabelle. Gli ordini non hanno un nome ed un cognome, piuttosto dovrebbero avere il riferimento ad un cliente. E chiamare una tabella righe è offensivo nei suoi confronti.
    Ultima modifica di mzanella : 03-08-2018 alle ore 08.56.28

    I suggerimenti che do più spesso:


  3. #3
    phollia non è connesso Utente giovane
    Data registrazione
    05-02-2015
    Messaggi
    68

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Gli ordini non hanno un nome ed un cognome, piuttosto dovrebbero avere il riferimento ad un cliente. E chiamare una tabella righe è offensivo nei suoi confronti.
    Non si tratta di una situazione standard, con clienti -> ordini ma dietro c'è una struttura (non dipendente da me tra l'altro) con applicativo abbastanza complesso, per cui nella tabella ci stanno dentro anche il nome e il cognome.

    Anche a voler spostare il tutto con una struttura normalizzata il risultato non cambia poichè mettendo in JOIN la tabella ordini con la tabella clienti, saremmo sempre di fronte ad un record per ordine.

    Comunque, grazie. Vedo cosa vien fuori con la tua costruzione.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •