Unione Tabelle

di il
5 risposte

Unione Tabelle

Ciao a tutto il forum,
sono impantanato con l'unione (credo si debbano unire) di due query.
Praticamente ho in DB due tabelle
1- anagrafica (id_anagrafica, cognome, nome ecc...)
2- mix (id_mix, id_anagrafica ecc...)
E' possibile che per ogni mix ci possano essere più di un nominativo e in sostanza, dato questo punto di partenza

A mix1
B mix1
A mix2
B mix2
C mix2
A mix3
dovrei aver questo risultato:

A mix1
B
A mix2
B
C
A mix3

Ho provato ad usare la funzione UNION :

SELECT anagrafica.cognome, att_add.`data`, mix.mix, att_add.oper, att_add.abt, att_add.`start`, att_add.`end`, posizione.posizione, att_add.note FROM anagrafica RIGHT JOIN att_add ON anagrafica.id_an=att_add.id_ana LEFT JOIN mix ON att_add.id_mx=mix.id_mix LEFT JOIN posizione ON att_add.id_posiz=posizione.id_posizione GROUP BY att_add.start HAVING att_add.data
UNION
SELECT anagrafica.cognome, anagrafica.nome, att_add.`data`, mix.mix, att_add.oper, att_add.abt, att_add.`start`, att_add.`end`, posizione.posizione, att_add.note, FROM anagrafica RIGHT JOIN att_add ON anagrafica.id_an=att_add.id_ana LEFT JOIN mix ON att_add.id_mx=mix.id_mix LEFT JOIN posizione ON att_add.id_posiz=posizione.id_posizione


Ma mi dice che "La SELECT utilizzata ha un numero di colonne differente".

Potreste aiutarmi per favore?
Grazie in anticipo.

5 Risposte

  • Re: Unione Tabelle

    dan80 ha scritto:


    Ma mi dice che "La SELECT utilizzata ha un numero di colonne differente".
    Potreste aiutarmi per favore?
    Mi sembra che l'errore dica tutto: controlla i campi che hai messo nelle due SELECT che poni in UNION e accertati che siano in numero uguale.
  • Re: Unione Tabelle

    Si ho provato a fare una SELECT con un campo a tutte e due le query ma chiaramente mi restituisce

    A
    mix1
    B
    mix2
    A
    mix2
    B
    mix2
    C
    mix2
    A
    mix3

    Ho ritentato con

    SELECT anagrafica.cognome, att_add.data, att_add.start FROM anagrafica RIGHT JOIN att_add ON anagrafica.id_an=att_add.id_ana LEFT JOIN mix ON att_add.id_mx=mix.id_mix LEFT JOIN posizione ON att_add.id_posiz=posizione.id_posizione, (SELECT att_add.start FROM anagrafica RIGHT JOIN att_add ON anagrafica.id_an=att_add.id_ana LEFT JOIN mix ON att_add.id_mx=mix.id_mix LEFT JOIN posizione ON att_add.id_posiz=posizione.id_posizione GROUP BY att_add.start) as tab1
    GROUP BY att_add.start HAVING att_add.data;

    Mi raggruppa i campi della tab MIX ma mi restituisce solo i primi record dalla tab ANAGRAFICA.

    Come potrei ottenere una cosa del genere
    A mix1
    A-B-C mix2
    A mix3
    ?

    Grazie ancora in anticipo
  • Re: Unione Tabelle

    dan80 ha scritto:


    Come potrei ottenere una cosa del genere
    A mix1
    A-B-C mix2
    A mix3
    ?
    Lo scenario mi è molto chiaro, ma mi pare che tu voglia generare tante colonne quanti sono i record di una tabella che corrispondono a una query, quindi non penso che sia possibile utilizzando una query "normale" come stai approntando.

    Non avendo una conoscenza approfondita delle tue tabelle, non saprei se la struttura ci pone in un contesto di "pivot" dei dati, ad ogni modo prova a dare una letta a questo articolo e a valutare se il contesto rappresentano assomiglia a quello che vorresti ottenere tu.

    Ciao!
  • Re: Unione Tabelle

    Ciao,
    si più o meno si avvicina ma io non devo fare un conteggio, dovrei riportare i valori.
    che casino...
    se vi viene qualche idea intanto continuo a provare

    Grazie mille
  • Re: Unione Tabelle

    Ciao a tutti nel capo potesse interessare ho risolto creando un istruzione in php con la seguente query

    SELECT
    `m`.`id_mix`, `m`.`mix`,
    `aa`.`data`, `aa`.`oper`, `aa`.`abt`, `aa`.`start`, `aa`.`end`, `aa`.`note`,
    `a`.`grado`, `a`.`cognome`, `a`.`nome`,
    `p`.`posizione`

    FROM `mix` `m`

    LEFT JOIN `att_add` `aa` ON `m`.`id_mix` = `aa`.`id_mx`
    LEFT JOIN `anagrafica` `a` ON `aa`.`id_ana` = `a`.`id_an`
    LEFT JOIN `posizione` `p` ON `aa`.`id_posiz` = `p`.`id_posizione`

    ORDER BY `m`.`mix` ASC, `a`.`cognome` ASC, `a`.`nome` ASC, `a`.`id_an` ASC
    [/i]

    ISTRUZIONE PHP

    $nominativi = [];
    $mix = [];
    while (!$att_add->atEnd()) {
    // estraiamo le informazioni in modo che sia facile accedervi
    $nominativo = [
    'id_mix' => $att_add->getColumnVal('id_mix'),
    'mix' => $att_add->getColumnVal('mix'),
    'data' => $att_add->getColumnVal('data'),
    'oper' => $att_add->getColumnVal('oper'),
    'abt' => $att_add->getColumnVal('abt'),
    'start' => $att_add->getColumnVal('start'),
    'end' => $att_add->getColumnVal('end'),
    'posizione' => $att_add->getColumnVal('posizione'),
    'note' => $att_add->getColumnVal('note'),
    'cognome' => $att_add->getColumnVal('cognome'),
    'nome' => $att_add->getColumnVal('nome'),
    'grado' => $att_add->getColumnVal('grado'),
    ];

    // contiamo quanti nominativi per ogni "mix"
    if (!isset($mix[$nominativo['id_mix']])) {
    $mix[$nominativo['id_mix']] = 0;
    }
    $mix[$nominativo['id_mix']]++;
    $nominativo['mix_indice'] = $mix[$nominativo['id_mix']];

    // memorizziamo ogni nominativo in modo che sia facile da visuallizare nella tabella
    $nominativi[] = $nominativo;

    // passiamo al nominativo successivo
    $att_add->moveNext();
    }
    ?>


Devi accedere o registrarti per scrivere nel forum
5 risposte