Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Query group and order [by]

    cari forumisti,

    ho questa query applicata ad un calendario interattivo:

    codice:
    $result = mysql_query("SELECT DATE_FORMAT(incontri_seminari.giorno,'%d') AS day,seminari.sede,seminari.titolo, utenti.cognome AS docente, incontri_seminari.ora_inizio AS oraIn, incontri_seminari.ora_fine AS oraOut, materia.materia, corsi.titoloCorsi AS corso, seminari.idseminari 
    FROM seminari
    LEFT JOIN incontri_seminari ON seminari.idseminari = incontri_seminari.seminari_idseminari
    LEFT JOIN utenti ON utenti.idutenti = seminari.docente_idutenti
    LEFT JOIN materia ON materia.idmateria=seminari.materia_idmateria
    LEFT JOIN corsi_has_seminari ON corsi_has_seminari.seminari_idseminari = seminari.idseminari
    LEFT JOIN corsi ON corsi_has_seminari.corsi_idcorsi = corsi.idcorsi
    WHERE datainizio BETWEEN  '$current_year/$current_month/01' AND '$current_year/$current_month/$total_days_of_current_month' $corsisess $materiasess $docentesess
    GROUP BY  seminari.titolo, day, corso
    ORDER BY oraIn, corso, seminari.titolo");
    andando al 15/01/2011 [http://www.scuolatao.com/corsi_agopu...rio-corsi.html] appare un elenco dove per ultimo c'è questo incontro indicato con inizio alle ore 15.00:

    1 Tuina MI | Crespi | Tuina Milano| 15:00:00
    La fisiologia delle 5 sostanze: jing, qi, shen, xue, jinye

    Io però mi aspetterei (e vorrei) che mi estraesse lo stesso corso ma l'incontro con ora inizio alle 10.00 dato che esiste come si vede clikkando sul corrispondente link: La fisiologia delle 5 sostanze: jing, qi, shen, xue, jinye

    Il problema non sta nel ORDER BY ma sicuramente avviene quando raggruppa per giorno (day)

    La cosa strana è che questo succede solo in alcune date (es. anche l' 08/01/2011) nonostante anche il record ID dell'incontro sia cronologicamente successivo

    Any idea ?

    Grazie, Nik

  2. #2
    Group by e distinct rendono un solo record per ogni raggruppamento.

    il record che ti rendono non lo puoi scegliere perche' sara' il primo che fisicamente viene trovato nello scorrere della tabella. A volte segue l'ordine cronologico dell'inserimento altre invece a seguito di cancellazione di un record precedente si puo' trovare fisicamente inserito in una posizione diversa.

    E' la logica del raggruppare. Prendo un id, il primo che trovo corrispondente a quanto richiesto che mi identifichi i valori raggruppati.

    GROUP BY seminari.titolo, day, corso
    ORDER BY oraIn, corso, seminari.titolo

    viene preso il primo record che rappresenti titolo, day, corso e vengono scartati tutti gli altri uguali, order by oraIn non serve perche' avrai un solo record che si porta dietro una oraIn casuale rispetto alla lista oraIn di quel dato giorno raggruppato. Prova a raggruppare anche per oraIn.

    l'ordine con cui sono memorizzati i dati e' casuale per definizione. Ogni record viene individuato e ordinato con una chiave primaria, ma fisicamente sara' dove c'era un buco libero per essere messo.

    Ho cercato di dare una risposta alla tua domanda ma non sono entrato nel merito della query se non per le ultime due righe.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Grazie Piero - capito

    Raggruppare per oraIn non posso perchè mi estrae dei dati diversi da quelli voluti....ma quindi dovrei prima fare una sub-query dove estraggo gli appuntamenti e li ordino per ora e poi raggruppo il tutto ?

    ..ci deve essere un modo..

  4. #4
    Originariamente inviato da nicemotion
    Grazie Piero - capito

    Raggruppare per oraIn non posso perchè mi estrae dei dati diversi da quelli voluti....ma quindi dovrei prima fare una sub-query dove estraggo gli appuntamenti e li ordino per ora e poi raggruppo il tutto ?

    ..ci deve essere un modo..
    si possono anche fare sub-query e poi raggruppare.

    Si puo' anche fare una tabella temporanea ordinata per come ti serve ed agire su quella. Vedi tu come fare.

    per esempio:

    codice:
    create temporary table temp
    select ..... la tua select senza il group by ma con l'ordinamento
    
    //ti crea una tabella temporanea con i dati selezionati poi a seguire
    
    select *
    from temp
    group by....
    order by

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    6

    un'idea

    Ho visto che gli errori nelle date 8/1 e 15/1 si verificano con lo stesso titolo del seminario. Potrebbe dipendere dal titolo del seminario che ha delle virgole e non viene gestito bene dalla query? E' solo un'ipotesi che mi è venuta in mente.

    ---------------------
    Saluti da Lingo
    ---------------------------

    Ciao da Lingo

  6. #6
    Originariamente inviato da piero.mac
    si possono anche fare sub-query e poi raggruppare.

    Si puo' anche fare una tabella temporanea ordinata per come ti serve ed agire su quella. Vedi tu come fare.

    per esempio:

    codice:
    create temporary table temp
    select ..... la tua select senza il group by ma con l'ordinamento
    
    //ti crea una tabella temporanea con i dati selezionati poi a seguire
    
    select *
    from temp
    group by....
    order by
    Interessante !
    non l'ho mai fatto...scritta cosi ?
    codice:
    $result = mysql_query("
    create temporary table temp
    SELECT DATE_FORMAT(incontri_seminari.giorno,'%d') AS day,seminari.sede,seminari.titolo, utenti.cognome AS docente, incontri_seminari.ora_inizio AS oraIn, incontri_seminari.ora_fine AS oraOut, materia.materia, corsi.titoloCorsi AS corso, seminari.idseminari 
    FROM seminari
    LEFT JOIN incontri_seminari ON seminari.idseminari = incontri_seminari.seminari_idseminari
    LEFT JOIN utenti ON utenti.idutenti = seminari.docente_idutenti
    LEFT JOIN materia ON materia.idmateria=seminari.materia_idmateria
    LEFT JOIN corsi_has_seminari ON corsi_has_seminari.seminari_idseminari = seminari.idseminari
    LEFT JOIN corsi ON corsi_has_seminari.corsi_idcorsi = corsi.idcorsi
    WHERE datainizio BETWEEN  '$current_year/$current_month/01' AND '$current_year/$current_month/$total_days_of_current_month' $corsisess $materiasess $docentesess
    ORDER BY oraIn, corso, seminari.titolo");
    
    "SELECT * from temp
    GROUP BY  seminari.titolo, day, corso";

  7. #7

    Re: un'idea

    Originariamente inviato da Lingo70
    Ho visto che gli errori nelle date 8/1 e 15/1 si verificano con lo stesso titolo del seminario. Potrebbe dipendere dal titolo del seminario che ha delle virgole e non viene gestito bene dalla query? E' solo un'ipotesi che mi è venuta in mente.

    ---------------------
    Saluti da Lingo
    Grazie Lingo ma temo che dipenda si da quel seminario ma perchè l'ordinamento generato nella cosrrispondente tabella incontri_seminari segue il "principio di Piero" e cioè che l'estrazione restituisce primo che fisicamente viene trovato nello scorrere della tabella (non per errori nel nome seminario...)

  8. #8
    Originariamente inviato da nicemotion
    Interessante !
    non l'ho mai fatto...scritta cosi ?
    No, devono essere due le query

    codice:
    $result1 = mysql_query("
    create temporary table temp
    SELECT DATE_FORMAT(incontri_seminari.giorno,'%d') AS day,seminari.sede,seminari.titolo, utenti.cognome AS docente, incontri_seminari.ora_inizio AS oraIn, incontri_seminari.ora_fine AS oraOut, materia.materia, corsi.titoloCorsi AS corso, seminari.idseminari 
    FROM seminari
    LEFT JOIN incontri_seminari ON seminari.idseminari = incontri_seminari.seminari_idseminari
    LEFT JOIN utenti ON utenti.idutenti = seminari.docente_idutenti
    LEFT JOIN materia ON materia.idmateria=seminari.materia_idmateria
    LEFT JOIN corsi_has_seminari ON corsi_has_seminari.seminari_idseminari = seminari.idseminari
    LEFT JOIN corsi ON corsi_has_seminari.corsi_idcorsi = corsi.idcorsi
    WHERE datainizio BETWEEN  '$current_year/$current_month/01' AND '$current_year/$current_month/$total_days_of_current_month' $corsisess $materiasess $docentesess
    ORDER BY oraIn, corso, seminari.titolo");
    
    $result2 = mysql_query("
    "SELECT * from temp
    GROUP BY  titolo, day, corso");

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Grazie Pietro, c'è ancora qualcosina che nn va xò:

    c'erano dei doppi apici che ho eliminato, ora sintatticamente pare corretta ma...

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in ... on line 111

    codice:
    $result1 = mysql_query("
    create temporary table temp
    .....
    
    $result = mysql_query(
    "SELECT * from temp
    GROUP BY  seminari.titolo, day, corso");
    
    while($row_event = mysql_fetch_object($result)) // questa è la 111 (anche se l'errore sta sopra credo)

  10. #10
    controlla bene la tua query con la mia....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.