Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    6,034

    count e select in una query

    ciaus

    Questa query dovrebbe restituire due colonne, rispettivamente la somma degli utenti e l'ultimo utente:
    codice:
    SELECT count(username)-1, username 
    FROM phpbb_users
    WHERE username <> 'ANONYMOUS'
    GROUP BY user_id DESC
    LIMIT 1
    però, al posto della somma degli utenti registrati, resituisce
    sempre zero

    posso avere questi due risultati in una sola query o devo per forza farne due?

  2. #2
    perche' non hai alcun "user_id DESC".

    metti il DESC nel ORDER BY e non nel GROUP BY....

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    6,034
    ma se metto ORDER BY al posto di GROUP BY dà l'errore:

    Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

  4. #4

    codice:
    SELECT count(username)-1, username 
    FROM phpbb_users
    WHERE username != 'ANONYMOUS'
    GROUP BY username
    ORDER BY user_id DESC
    LIMIT 1

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    6,034
    continua a mostrare 0:
    codice:
    count(username)-1  	 username
                    0 	 nick123

  6. #6
    La tabella l'hai tu... vuol dire che ne hai uno solo -1 = 0
    rispettivamente la somma degli utenti e l'ultimo utente:
    codice:
    SELECT count(*) as tot
    FROM phpbb_users
    WHERE username != 'ANONYMOUS'
    
    SELECT username
    FROM phpbb_users
    ORDER BY user_id DESC
    LIMIT 1
    O conti tutto oppure conti singolarmente per utente.

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    6,034
    no, di utenti ce ne sono più di uno....

    quindi, per ottenere il numero max e l'ultimo utente mi tocca fare due query... vabbè... volevo ottimizzare

  8. #8
    è normale che non sia fattibile

    tu vuoi conteggiare TUTTI gli utenti ma nello stesso instante vuoi anche estrarre un SOLO utente

    la clausola GROUP BY serve a RAGGRUPPARE le righe di conseguenza, in base a ciò che gli hai detto tu, lui raggruppa le righe in base ad un campo che di per se non ha copie, di conseguenza il count ritorna 1, e poi usi il limit dicendogli di estrarne uno soltanto, di conseguenza ti viene estratta l'ultima riga e, dato che la clausola group by non raggruppa un ciuffolo, viene conteggiato solo quello

    potresti usare una soluzione alternativa

    ovvero aggiungere un campo UGUALE IN TUTTE LE RIGHE e usi il group by su quello ottenendo cosi un raggruppamento valido

    l'unico problema è che non so se a quel punto, con group by, puoi ancora ordinare

    però questo dovresti poterlo risolvere cambiando l'ordinamento di default della tabella in DESC per il campo ID

    in pratica con la query (che necessita una SOLA esecuzione)

    ALTER TABLE phpbb_users ORDER BY user_id DESC

    dici a mysql che l'ordinamento di default è decrescente in base a user_id

    e poi con la query

    SELECT COUNT(*), username FROM phpbb_users GROUP BY campo_finto

    dove la colonna campo_finto è una colonna fittizzia, inutilizzata, inserita SOLAMENTE per permettere il raggruppamento di tutte le righe in base ad un discriminatore comune

  9. #9
    E' corretto il ragionamento che hai fatto compreso il discorso dell'ordinamento non piu' possibile.

    il problema non e' dare la colonna finta, ma fargli prendere l'ultimo id inserito validato nel where . vengono rese solo le righe contate, cioe' una.

    per fargli prendere un raggruppamento fasullo basta fare:
    codice:
    select *, count(*), 1 as num
    from tabella
    where username != 'pippo'
    group by num
    ma ti prendera' sempre e solo il primo record che fisicamente trova nel db. L'indice non viene usato in una query come questa, dovresti riscrivere la tabella mettendo nella prima posizione fisica l'ultimo id inserito. tanto vale farne due di query....


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

  10. #10
    piero, l'alter table serve proprio a cambiare l'ordinamento delle colonne che non influisce in alcun modo dato che le query di estrazione dei dati che devono essere visualizzate a video hanno un loro ordinamento

    non avevo invece pensato alla possibilità di creare un valore fittizzio direttamente nella query

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.