Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768

    [ MySql ] query SELECT un pò particolare

    ciao a tutti e buon Week-end (io però devo lavorare )

    devo realizzare una query select che fino ad oggi non mi era mai servita ed è più una curiosità che altro (si potrebbe risolvere facilmente con più query)

    in pratica, eliminando il superfluo) ho una tabella con questi campi:

    1) id;
    2) titolo;
    3) data_news; (il giorno dell'inserimento)
    4) categoria;

    allora come faccio (con una sola query) a selezionare l'ultimo annuncio inserito in ogni categoria (ovviamente il tutto ordinato per data)?

    esempio
    03/05/2005 "La politica..." categoria=6;
    02/05/2005 "Le donne..." categoria=1;
    01/05/2005 "mi sò rot..." categoria=3;

    :master:

  2. #2
    raggruppi per categoria, having max(data) order by data

    ma la data deve essere in formato yyyy-mm-dd e non come l'hai presentata tu.

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

  3. #3
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    [supersaibal]ma la data deve essere in formato yyyy-mm-dd e non come l'hai presentata tu. [/supersaibal]
    la data la memorizzo così

    Codice PHP:
    $giorno date("j");
    $mese =  date("n");
    $anno date("Y");
    $ore date("H");
    $minuti date("i");
    $secondi date("s");
    $data_news mktime($ore$minuti$secondi$mese$giorno$anno); 
    [supersaibal]Originariamente inviato da piero.mac
    raggruppi per categoria, having max(data) order by data
    [/supersaibal]
    ehm... si è proprio quello che... ehm un pò più esplicito

  4. #4
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    a prop dimenticavo...

    non devono essere prese tutte la categorie ma solo dalla 1 alla 5.

    cioè nel database per ogni record c'è un valore numerico nel campo categoria. questo deve essere o 1 o 2 o 3 o 4 o 5 gli altri devono essere esclusi...

    Se non è ancora abbastanza complicato cerco di trovare qualcos'altro

  5. #5
    codice:
    SELECT *, MAX(data_news) as max_news
    from tabella
    where categoria < 6
    GROUP BY categoria
    HAVING max_news = MAX(data_news)
    ORDER BY max_news DESC
    Se vuoi vengo a digitarlo (tarlo digitale) io...

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

  6. #6
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    [supersaibal]Originariamente inviato da piero.mac

    Se vuoi vengo a digitarlo (tarlo digitale) io... [/supersaibal]
    davvero saresti così gentile? Solo che casa mia à un pò complicata da spiegare, tu fai così: arriva a Teramo e poi ti spiego meglio come arrivare ok? :maLOL:

    A parte gli scherzi, non conoscevo le funzioni having e max

    ora si

    grazie

  7. #7
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    Non so perchè ma non funziona correttamente...

    invece di prendere l'ultima inserzione per ogni categoria, prende l'inserzione più vecchia... (ho verificato le date direttamente dal phpMyAdmin)
    e ho verificato anche il codice che mi hai postato direttamente sulla guida di MySql
    http://dev.mysql.com/doc/mysql/en/ex...umn-group.html

    cosa c'è che non va?

    Riporto alcuni record della tabella (le categorie che mi servono sono sopra la numero 50)

    3 (id) - articolo1 - 1115569987 (data) - 57 (categoria)
    4 - articolo2 - 1115570274 - 57
    5 - articolo3 - 1115570428 - 58
    6 - articolo4 - 1115570457 - 58

    ottengo questo output:
    articolo1
    articolo3

    invece di:

    articolo2
    articolo4

    la query leggermente modificata è
    Codice PHP:
    SELECT *, MAX(data_news) as max_news
                           from 
    `news`
                           
    where categoria 56
                           GROUP BY categoria
                           HAVING max_news 
    MAX(data_news)
                           
    ORDER BY max_news ASC 
    :master:

  8. #8
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Non credo che con HAVING si risolvano le ambiguità degli attributi che non sono in MAX e GROUP BY.

    Se hai mysql >=4.1 prova questa:

    SELECT *
    FROM `news`
    WHERE categoria > 56 AND data_news IN (
    SELECT MAX(data_news)
    FROM `news`
    GROUP BY categoria
    )

    Problemi li puoi avere se hai date uguali.

  9. #9
    Utente di HTML.it L'avatar di gasmor
    Registrato dal
    Apr 2004
    Messaggi
    1,768
    [supersaibal]Originariamente inviato da Teuzzo

    Se hai mysql >=4.1 ...
    [/supersaibal]
    purtroppo ho la 3.23.58 (questione di host )

    ma quale pensi sia l'errore?

  10. #10
    Il problema e' che ho gia' riscontrato altre volte che il comportamento non e' sempre attendibile. Non saprei se dipende dalla versione o dal tipo di campo. Per esempio sul formato date pare funzionare meglio.

    Da tempo ho rinunciato a questo tipo di query. Nel senso che DISTINCT e GROUP BY non sono fatti per scegliere un determinato record, ma per avere un gruppo di valori associato ad un campo. Per esempio quelle query citate nel manuale...

    SELECT user,MAX(salary) FROM users
    GROUP BY user HAVING MAX(salary) > 10

    che equivale per te ad avere la data piu' alta associata alla categoria e basta. Mi ricordo anche di un lungo post con andr3a su questo argomento e concomitante a questo con altro utente che ora non ricordo.

    Personalmente ho risolto quando mi serve l'ultimo record inserito ho risolto con una tabella temporanea, dove ordino in base alla necessita' e poi prendo il primo record che trova e che ora corrisponde a quello voluto...
    codice:
    CREATE TEMPORARY TABLE temp 
    SELECT * 
    FROM `news` 
    WHERE categoria > 56
    ORDER BY data DESC ;
    
    SELECT * 
    FROM TEMP
    GROUP BY categoria
    ORDER BY categoria
    funziona sempre.


    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.