Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    434

    [SQL] Particolare query con COUNT

    Ciao a tutti. Ho una query un po' lunghetta che dovrebbe selezionare il numero delle colonne di una tabella secondo diversi criteri. Il problema è che ottengo 0 in tutte, anche se quando ne eseguo "una alla volta" ottengo il risultato giusto. Vi scrivo la query:

    SELECT COUNT(a.id) AS active, COUNT(b.id) AS postponed, COUNT(c.id) AS draft FROM news_articles a, news_articles b, news_articles c WHERE a.type = 1 AND b.type = 2 AND c.type = 3

    Se io ad esempio eseguo una query che selezioni solo un tipo, come..

    SELECT COUNT(a.id) FROM news_articles a WHERE a.type = 1

    mi restituisce il risultato desiderato. Se eseguo una query "all together", mi da tutti zeri. Come poso rimediare?

  2. #2
    dovresti raggruppare per type:

    codice:
    select type, count(id) as num_type
    from news_article
    group by type

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    434
    non riesco a costruire la query..riesci a farmi una query che faccia quello che intendo usando quella di sopra? mi va bene anche se la fai con due elementi, tanto nella query completa sono più di 10 tabelle con criteri diversi..

  4. #4

    Re: [SQL] Particolare query con COUNT

    Questa query:
    Originariamente inviato da billo
    SELECT COUNT(a.id) AS active, COUNT(b.id) AS postponed, COUNT(c.id) AS draft
    FROM news_articles a, news_articles b, news_articles c
    WHERE a.type = 1 AND b.type = 2 AND c.type = 3
    e questa query:
    Originariamente inviato da billo
    SELECT COUNT(a.id) FROM news_articles a WHERE a.type = 1

    hanno in comune niente, tranne chi le ha scritte

    La seconda è una semplice query di conteggio ma la prima non è assolutamente quello che credi che sia.

    Scrivere:
    SELECT ...
    FROM a, b, c
    non prende assolutamente i dati da quelle 3 tabelle così come sono ma effettua un prodotto vettoriale (AxBxC) delle tre tabelle, ovvero possiamo dire che ti tira fuori come tutti i possibili incroci tra le tre tabelle e successivamente filtra i risultati mostrandoti solo la tuple (le righe) dove:
    a.type = 1 AND b.type = 2 AND c.type = 3
    contemporaneamente.

    E se ti da tutti 0 evidentemente non c'è quella particolare combinazione.

    Ti posso solo consigliare di vedere le JOIN SQL come funzionano.
    Administrator of NAMDesign.Net

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    ho avuto il tuo stesso problema venerdì al lavoro, ho risolto così (mysql 4 e 5)

    codice:
    SELECT  COUNT(DISTINCT a.id) AS active, 
            COUNT(DISTINCT b.id) AS postponed, 
            COUNT(DISTINCT c.id) AS draft 
    FROM    news_articles AS a, 
            news_articles AS b, 
            news_articles AS c 
    WHERE   a.type = 1 
    AND     b.type = 2 
    AND     c.type = 3
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    434
    @drwatson: l'avevo già provato..ma non ha funzionato..

    @LeaderGL: ma io se uso il join, nel select metto comunque i count delle varie tabelle:
    SELECT COUNT(a.id) AS tizio, COUNT(b.id) AS caio FROM tabella1 a WHERE a.qualcosa = 'qualcosaltro' LEFT JOIN tabella2 b ON b.qualcosa2 = 'qualcosaltro2'

    Quindi credo che non cambi molto..comunque come l'ho scritta va bene? Posso provarla? Che intendi comunque per prodotto vettoriale? Una specie di prodotto di insiemi che incrocia le 3 tabelle contando le righe della tabella risultante?

  7. #7
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    con il distinct nel count ?? :master:
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    434
    sì..mi dava 0 comunque

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    434
    scusate per il doppio messaggio, comunque ho risolto con il join, mi scuso per averne dubitato prima :S.. ho usato una query di questo tipo:

    SELECT COUNT(a.id) AS active, COUNT(b.id) AS postponed, COUNT(c.id) AS draft FROM news_articles a LEFT JOIN news_articles b ON b.type = 2 AND a.type = 1 LEFT JOIN news_articles c ON c.type = 3

    Comunque mi potete spiegare che cambia tra il LEFT JOIN, RIGHT JOIN e INNER JOIN? Su w3schools.com e altre fonti viene spiegato, ma non è che ci abbia capito molto.

  10. #10
    Originariamente inviato da billo
    scusate per il doppio messaggio, comunque ho risolto con il join, mi scuso per averne dubitato prima :S.. ho usato una query di questo tipo:

    SELECT COUNT(a.id) AS active, COUNT(b.id) AS postponed, COUNT(c.id) AS draft FROM news_articles a LEFT JOIN news_articles b ON b.type = 2 AND a.type = 1 LEFT JOIN news_articles c ON c.type = 3

    Comunque mi potete spiegare che cambia tra il LEFT JOIN, RIGHT JOIN e INNER JOIN? Su w3schools.com e altre fonti viene spiegato, ma non è che ci abbia capito molto.
    Perfetto mi fa piacere che l'input sia servito.

    Le JOIN sono varie, complesse e potenti ma bisogna stare attenti nel loro uso perchè sicuramente appesantiscono il server.

    In genere, come hai fatto tu, quando si applica una JOIN si specifica la clausola ON per indicare gli attributi su cui effettuare il JOIN. Se quella condizione non è verificata la linea in esame viene scartata.

    I principali tipi di join:
    [list=1][*]LEFT JOIN[*]RIGHT JOIN[*]INNER JOIN [*]OUTER JOIN[*]CROSS JOIN[*]NATURAL JOIN[/list=1]

    Alcune "combinazioni":
    [list=1][*]LEFT OUTER JOIN (equivalente a LEFT JOIN)[*]RIGHT OUTER JOIN (equivalente a RIGHT JOIN)[*]FULL OUTER JOIN[/list=1]

    spiegare il significato di tutte è decisamente lungo...ti consiglio di andare a vedere qui: http://dev.mysql.com/doc/refman/5.0/en/join.html
    Administrator of NAMDesign.Net

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.