Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 47
  1. #1

    [mysql] riepilogo (COUNT) su due tabelle

    Ho due tabelle simili, una per gli insegnanti ed i loro corsi ed una per gli allievi ed i corsi a cui sono iscritti.
    I campi sono:
    id, corso, id_insegnanti
    id, corso, id_allievo

    I record delle tabelle:

    id corso id_allievo
    1 CHITARRA ELETTRICA 1
    2 CONTRABBASSO 1
    3 CHITARRA ELETTRICA 2
    4 CONTRABBASSO 2
    5 CHITARRA ELETTRICA 3
    6 CONTRABBASSO 3
    7 TROMBA 4
    8 VIOLINO 4
    9 CHITARRA CLASSICA 5
    10 TROMBA 5
    29 BATTERIA 6
    12 TROMBA 6
    27 SASSOFONO 14
    26 TROMBA 13
    25 SASSOFONO 13
    24 VIOLINO 12
    23 SASSOFONO 12
    19 SASSOFONO 10
    20 TROMBA 10
    21 SASSOFONO 11
    22 VIOLINO 11
    28 TROMBA 14
    sc_corsi_docenti
    id corso id_insegnanti
    1 CHITARRA ELETTRICA 1
    2 CONTRABBASSO 1
    3 CHITARRA CLASSICA 2
    4 TROMBA 2
    5 SASSOFONO 3
    6 VIOLINO 3
    7 TROMBA 1
    8 BATTERIA 4
    9 EDUCAZIONE MUSICALE 4

    Facendo i riepiloghi dei corsi per ciascuna tabella ottengo i giusti riepiloghi:
    I corsi assegnati allo staff
    Corsi N. ass
    BATTERIA 1
    CHITARRA CLASSICA 1
    CHITARRA ELETTRICA 1
    CONTRABBASSO 1
    EDUCAZIONE MUSICALE 1
    SASSOFONO 1
    TROMBA 2
    VIOLINO 1

    I corsi assegnati agli allievi
    Corsi N. ass
    BATTERIA 1
    CHITARRA CLASSICA 1
    CHITARRA ELETTRICA 3
    CONTRABBASSO 3
    SASSOFONO 5
    TROMBA 6
    VIOLINO 3


    Ora quel che desidero ottenere è una cosa del genere:
    corsi staff assegnati allievi assegnati
    BATTERIA 1 1
    CHITARRA CLASSICA 1 1
    CHITARRA ELETTRICA 1 3
    CONTRABBASSO 1 3
    EDUCAZIONE MUSICALE 1
    SASSOFONO 1 5
    TROMBA 2 6
    VIOLINO 1 3

    Ho provato con una UNION, con una INNER JOIN che restituiscono risultati non soddisfacienti o inesatti e con altri metodi che mi restituiscono degli errori.
    UNION
    Codice PHP:
    $Query_corsi_full "
      SELECT corso, count( id_insegnanti )  AS tot,  'ins' AS tipo
      FROM sc_corsi_docenti
      GROUP  BY corso
      UNION  
      SELECT corso, count( id_allievo )  AS tot,  'all' AS tipo
      FROM sc_corsi_allievi
      GROUP  BY corso
      ORDER  BY tipo, tot
    "

    JOIN
    Codice PHP:
    $Query_corsi_full ="
      SELECT sc_corsi_docenti.corso AS corsoA, count( sc_corsi_docenti.id_insegnanti )  AS totA,  'ins' AS tipoA, 
      sc_corsi_allievi.corso AS corsoB, count( sc_corsi_allievi.id_allievo )  AS totB,  'all' AS tipoB
      FROM sc_corsi_docenti  
      INNER  JOIN sc_corsi_allievi 
      ON sc_corsi_docenti.id = sc_corsi_allievi.id
      GROUP  BY sc_corsi_docenti.corso, sc_corsi_allievi.corso
    "

    Con la UNION ottengo risultati giusti, ma, giustamente, coi dati intabellati in modo verticale.
    Con la JOIN ottengo i dati intabellati in maniera orizzontale, ma con risultati errati:

    Ora chiedo se c'è un modo per ottenere i dati disposti come nell'esempio mostrato più sopra.
    Grazie per l'attenzione.
    Ultima modifica di micdas; 24-03-2016 a 02:21

  2. #2
    Intanto vado avanti con le prove.
    Ho pensato di usare anche questa Query che usa una seconda SELECT nell'elenco dei campi eche potrebbe sembrare valida.
    Codice PHP:
    $Query "
    SELECT corso, count( id_insegnanti )  AS tot,  'ins' AS tipo, (
    SELECT corso, count( id_allievo )  AS tot,  'all' AS tipo
    FROM sc_corsi_allievi
    GROUP  BY corso
    )
    FROM sc_corsi_docenti
    GROUP  BY corso 
    Purtroppo mi restituiscce un errore da cui non non riesco a venirne a capo:
    #1241 - Operand should contain 1 column(s)
    Penso che, se si riuscisse ad aggiustare questa query, potrei risolvere il problema.

    Grazie ancora per gli eventuali suggerimenti

  3. #3
    Quote Originariamente inviata da micdas Visualizza il messaggio
    ...
    Ora quel che desidero ottenere è una cosa del genere:
    corsi staff assegnati allievi assegnati
    BATTERIA 1 1
    CHITARRA CLASSICA 1 1
    CHITARRA ELETTRICA 1 3
    CONTRABBASSO 1 3
    EDUCAZIONE MUSICALE 1
    SASSOFONO 1 5
    TROMBA 2 6
    VIOLINO 1 3

    UNION
    Codice PHP:
    $Query_corsi_full "
      SELECT corso, count( id_insegnanti )  AS tot,  'ins' AS tipo
      FROM sc_corsi_docenti
      GROUP  BY corso
      UNION  
      SELECT corso, count( id_allievo )  AS tot,  'all' AS tipo
      FROM sc_corsi_allievi
      GROUP  BY corso
      ORDER  BY tipo, tot
    "

    ... buona questa , solo che invece della union devi fare un join sulle le due raggruppate
    e , se ben ricordo , mysql permette la join tra subquery.

    Non provata , ma con qualche aggiustamento dovrebbe funzionare
    codice:
    SELECT * FROM
    (
     SELECT corso, count( id_insegnanti )  AS tot,  'ins' AS tipo
       FROM sc_corsi_docenti
       GROUP  BY corso
    ) AS Q1
      LEFT JOIN  
    (
      SELECT corso, count( id_allievo )  AS tot,  'all' AS tipo
       FROM sc_corsi_allievi
       GROUP  BY corso
    ) AS Q2
    ON Q1.corso=Q2.corso

  4. #4
    Colpito ed affondato.
    Grazie sspintux

    Ecco il risultato dal vivo della tua Query:

    corso tot tipo corso tot tipo
    BATTERIA 1 ins BATTERIA 1 all
    CHITARRA CLASSICA 1 ins CHITARRA CLASSICA 1 all
    CHITARRA ELETTRICA 1 ins CHITARRA ELETTRICA 3 all
    CONTRABBASSO 1 ins CONTRABBASSO 3 all
    EDUCAZIONE MUSICALE 1 ins NULL NULL NULL
    SASSOFONO 2 ins SASSOFONO 5 all
    TROMBA 2 ins TROMBA 6 all
    VIOLINO 1 ins VIOLINO 3 all

    E' esattamente quel che volevo.
    Senza la tua query avrei dovuto ricorrere alla elaborazione in PHP, che sinceramente mi avrebbe fatto rizzare i capelli.

    Grazie e Buona Pasqua.


  5. #5
    Quote Originariamente inviata da micdas Visualizza il messaggio
    Grazie e Buona Pasqua.

    Prego e buona Pasqua anche a te e tutto il forum

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,344
    Una cortesia. Puoi testare questa query ?

    Codice PHP:
    SELECT t1.corsocountid_insegnanti ),sum(case when id_allievo is null then 0 else 1 end)
    From sc_corsi_docenti t1
    left join sc_corsi_allievi   t2 on t1
    .corso t2.corso
    Group by t1
    .corso 
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Mi sembra ci voglia
    Codice PHP:
     ..., countdistinct id insegnante) ..... 
    [/QUOTE]

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,344
    Infatti manca una tabella corsi.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Infatti manca una tabella corsi.
    Non l'ho capita. Sara' l'ammazzacafe' .
    Ne riparliamo domani a mente
    piu' fresca dopo la braciolata con contorno di salsiccie

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,344
    Anzi. La struttura attuale non va.
    Prima cosa. Non si fa mai un legame tra tabelle con delle descrizioni. Se hai fatto un errore nella descrizione e che te ne accorgi dopo avere riempito le tabelle sarà un gran casino modificarla. Dovrai fare un update di molti record in entrambe tabelle. Mentre con un'altra struttura fai una sola modifica (quella della descrizione). Ricorda che in informatica bisogna sempre non fare di più del necessario.

    Seconda cosa. In entrambe tabelle i campi id non servono a nulla. La chiave primaria è corso (o id_corso), id_allievo e corso (o id_corso), id_insegnante.

    Terza cosa. Con la struttura attuale si sa se un allievo segue un certo corso ma non con quale insegnante.

    Tabella corsi :
    * id_corso,
    * descrizione

    Tabella corsi/insegnante :
    * id_corso,
    * id_insegnante

    Tabella corsi/allievo :
    * id_corso
    * id_allievo
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

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