Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Ruggine su query

  1. #1

    Ruggine su query

    Ho un database del tipo

    ID | STATO-ORDINE | ID-ORDINE

    In pratica per ogni ordine è possibile classificare uno stato dell' ordine.
    Se voglio conoscere quale sia l' ultimo stato impostato per qualsiasi ordine ho risolto così, ma mi sembra un pò troppo macchinoso.....mi aiutate ad alleggerirlo ?

    SELECT `order_id` , `order_status_id`
    FROM `order_history`
    WHERE `order_history_id`
    IN (

    SELECT MAX( order_history_id )
    FROM `order_history`
    GROUP BY `order_id`)


    In pratica leggo quale sia lo stato dell' ordine che ha id (autoincrement ovviamente) maggiore....ma la query mi sembra scritta malino....
    www.fulleffect.it
    Il miglior sito hip hop in Italia.

    FAIEL aka Raffaele Madaro
    FORZA BARI !!

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333

    Re: Ruggine su query

    la tua clausoka WHERE ti puo restituire solamente 1 record
    SELECT MAX( order_history_id ) FROM `order_history` GROUP BY `order_id`

    Pertanto al posto di " IN " mettici " = "


    .

  3. #3
    @NMAN la subquery non restituisce un solo record

    @FAIEL potresti riscriverla come join tra la query esterna che già fai e la query con group by, una cosa del genere:

    SELECT a.`order_id` , a.`order_status_id`
    FROM `order_history` AS a
    INNER JOIN (
    SELECT MAX( order_history_id )
    FROM `order_history`
    GROUP BY `order_id`
    ) AS b
    ON a.order_id = b.order_id

    Se usi MySQL 5.6 (o MariaDB 5.3) dovrebbe riscriverla internamente, ma io questa modifica la farei comunque.
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da in the web
    @NMAN la subquery non restituisce un solo record
    Hai ragione, ....... che figuraccia che ho fatto

    .

  5. #5
    Originariamente inviato da nman
    Hai ragione, ....... che figuraccia che ho fatto

    .
    Ma no, per la fretta ti sarà sfuggita la group by
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  6. #6
    Prova così:

    SELECT `order_id`, MAX( order_history_id )
    FROM `order_history`
    GROUP BY `order_id`

    o così:

    SELECT `order_id` , `order_status_id`
    FROM `order_history` A,
    (SELECT MAX( order_history_id ) order_history_id
    FROM `order_history`
    GROUP BY `order_id`) B
    WHERE A.order_history_id=B.order_history_id
    WHERE A.`order_history_id`


    Ciao
    Mik

  7. #7
    @Holidaysoft.it purtroppo le tue query sono sbagliate. Se hai una GROUP BY, nella query puoi selezionare solo:
    * i campi che sono presenti nella GROUP BY
    * altri campi, ma solo se passati ad una funzione aggregante (come MAX)
    Diversamente, MySQL preleva gli altri campi da una riga scelta a caso. E' per questo che consiglio di usare sempre l'sql_mode ONLY_FULL_GROUP_BY.

    Ulteriori dettagli qui:
    http://dev.mysql.com/doc/refman/5.5/...xtensions.html

    Credo comunque che non ci siano query più ottimali di quella che ho consigliato sopra...
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  8. #8
    Originariamente inviato da in the web
    @Holidaysoft.it purtroppo le tue query sono sbagliate. Se hai una GROUP BY, nella query puoi selezionare solo:
    * i campi che sono presenti nella GROUP BY
    * altri campi, ma solo se passati ad una funzione aggregante (come MAX)
    Diversamente, MySQL preleva gli altri campi da una riga scelta a caso. E' per questo che consiglio di usare sempre l'sql_mode ONLY_FULL_GROUP_BY.

    Ulteriori dettagli qui:
    http://dev.mysql.com/doc/refman/5.5/...xtensions.html

    Credo comunque che non ci siano query più ottimali di quella che ho consigliato sopra...
    ..........non a caso ho indicato anche la query:

    SELECT `order_id` , `order_status_id`
    FROM `order_history` A,
    (SELECT MAX( order_history_id ) order_history_id
    FROM `order_history`
    GROUP BY `order_id`) B
    WHERE A.order_history_id=B.order_history_id
    WHERE A.`order_history_id`

    che dovrebbe dare la possibilità di estrarre quello che vuoi dalla tabella A...

    Ciao
    Mik

  9. #9
    Quella query è sbagliata a livello di sintassi, guardala bene o prova a eseguirla. In ogni caso se la subquery contiene la group by incontrerai sempre il problema che ho detto.

    Comunque ripeto quello che ho suggerito ieri:

    SELECT a.`order_id` , a.`order_status_id`
    FROM `order_history` AS a
    INNER JOIN (
    SELECT MAX( order_history_id )
    FROM `order_history`
    GROUP BY `order_id`
    ) AS b
    ON a.order_id = b.order_id

    EDIT pardon, riguardandola ho capito che volevi fare quello che ho fatto io con un'altra sintassi... quindi non vale la critica della group by, ma resta il fatto che è sbagliata
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  10. #10

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.