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

    Php - Ordinare valori prima di fare un group by

    Salve a tutti

    Sto cercando di ordinare una select prima per dopo poter fare un group by in modo da avere i valori univoci scelti secondo un criterio.

    In pratica dovrei prima ordinare tutti i campi per valore (pamount) e dopo fare un group by (title) in modo da avere in pratica un risultato univoco dei title selezionati per pamount maggiore.

    Mostro una tabella di cio che dovrei selezionare



    codice:
    $sql=$Db1->query("SELECT * FROM ptsuads WHERE credits>=1 and (country='' or country='$thismemberinfo[country]') and active='1' and (upgrade='0' ".iif($thismemberinfo[type]==1," or upgrade='1'").") GROUP BY title ORDER BY $orderby $type");
    In questo momento la query sembra che col GROUP BY scelga univocamente i title con ID piu basso (credo che sia di default cosi il php) senza che io possa intervenire dato che non ho specificato nulla al riguardo.

    Attualmente la query seleziona univocamente i dati (per title) e dopo con la funzione ORDER BY li mostra ordinati però il problema è che attualmente il GROUP BY sceglie cio da mostrare senza che io possa decidere in base a che parametri (in questo caso dovrei scegliere quello con pamoumt maggiore e con title univoco)

    Spero possiate aiutarmi

    Vi ringrazio

    Buonasera

  2. #2
    Se ho capito bene il problema devi rivedere un poco la logica della query.
    Intanto se vuoi dei valori distinti su una colonna che non sia nel group by, devi dire al db server che li vuoi distinti.
    Inoltre, a meno che ci sia un motivo preciso per farlo, è meglio selezionare solo le colonne che effettivamente servono all'elaborazione. Mi spiego. Se nella tua query tu cerchi i record che hanno la colonna credits valorizzata >= 1 ma nell'elaborazione successiva questo dato non lo usi, allora non ha senso includerlo tra le info che estrai dal db.
    Altra cosina. Se vui un ordinamento, devi ovviamente indicarlo, quindi se vuoi ordinare per pamount devi indicare tale colonna nella clausola "order by", e ovviamente dato che l'ordinamento lo vuoi decrescente, devi indicare "desc"; di default mysql ordina "asc".

    Spero di averti chiarito i dubbi, nel caso siamo qui


  3. #3
    Purtroppo non hai capito il problema.

    A me interessa che il group by prenda dei valori che attualmente esclude

    I risultati sono gia ordinati perfettamente

    ma ho bisogno di imporre al group by di scegliere dei precisi valori e non quelli di default (credo che il group by quanto trova dati ripetuti prende quello con id piu basso).

    Rileggi il post che ho scritto in quanto non hai capito la mia richiesta

    grazie

  4. #4
    Beh ma è ovvio che facendo un group by non puoi fidarti della chiave univoca, non ha nemmeno senso dato che stai raggruppando dei dati.
    La tua descrizione non è chiara, dato che da una parte parli di raggruppamento, da un'altra di ordinamento e da un'altra ancora di "max".
    Cosa vuoi ottenere dalla tabella che hai mostrato?

  5. #5
    Salve

    Ti ringrazio dell'aiuto e ti spiego come cosa dovrei fare.

    Ho una lista di valori simile questa immagine



    La query originale del cms seleziona UNIVOCAMENTE (CIOE 1 SOLO CON LO STESSO TITLE) i valori dall'sql e li mostra a video ordinandoli già in modo esatto con (ORDER BY $orderby $type).

    Unico problema è che il group by seleziona i valori univoci senza che io possa indicare di prendere quello col pamount piu alto.

    Come vedi nella immagine sopra mi interesserebbe che il group by mi selezionasse i valori in verde mentre seleziona univocamente ma non mi permette di stabilire quali.


    Questo è il codice della query originale
    Codice PHP:
    $sql=$Db1->query("SELECT * FROM ptsuads WHERE credits>=1 and (country='' or country='$thismemberinfo[country]') and active='1' and (upgrade='0' ".iif($thismemberinfo[type]==1," or upgrade='1'").") GROUP BY title ORDER BY $orderby $type"); 
    Spero che qualcuno posso darmi un consiglio o farmi degli esempi

    Vi ringrazio tutti

  6. #6
    Per la precisione questa è una domanda da database e non da php, comunque:
    codice:
    SELECT title, MAX(pamount) FROM tabella
      GROUP BY title

  7. #7
    Ciao ho provato la soluzione da te proposta ma continua a mostrarmi valori che non sono quelli corretti, l'avevo gia provata anche alcuni giorni ma non riesce a selezionarmi i valori con pamount maggiore.

  8. #8
    Mi sono creato una tabella e l'ho valorizzata con i dati che hai messo di esempio:
    codice:
    CREATE TABLE IF NOT EXISTS `tabella` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(15) NOT NULL,
      `amount` tinyint(3) unsigned NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
    
    --
    -- Dump dei dati per la tabella `mesi`
    --
    
    INSERT INTO `tabella` (`ID`, `nome`, `amount`) VALUES
    (1, 'aaa', 5),
    (2, 'aaa', 1),
    (3, 'aaa', 8),
    (4, 'bbb', 15),
    (5, 'bbb', 8),
    (6, 'bbb', 6),
    (7, 'ccc', 15),
    (8, 'ccc', 24),
    (9, 'ccc', 9);
    Ho eseguito la query
    codice:
    SELECT nome, MAX( amount )
    FROM tabella
    WHERE 1
    GROUP BY nome
    Ecco il risultato
    codice:
    nome 	MAX(amount)
    aaa 	8
    bbb 	15
    ccc 	24
    Mi sembra tutto corretto....cosa ti restituisce la tua query e soprattutto che query viene eseguita?

  9. #9
    Ciao

    Ti ringrazio per la pazienza e per aiuto che mi stai dando.

    Posto sia il codice delle pagine e sia le foto cosi vedi in chiaro i risultati.

    La query in oggetto la uso in un gestore di sponsor per mostrare gli sponsor che valgono di piu.

    Applico una condizione per ridurre la pagina ma il risultato non cambia per mostrarti che non seleziona il valore piu alto e spero che mi puoi aiutare a trovare una soluzione.

    1) pagina con tutta la lista dei banner SENZA IL GROUP BY
    ci sono 4 scelte con diversi pamount il maggiore è quello di 0.42 (e sarebbe questo da scegliere col group by)



    codice:
    $sql=$Db1->query("SELECT * FROM ptsuads WHERE title = 'Meetic Affinity' AND credits>'0' AND active='1' AND (country='' or country='$thismemberinfo[country]') AND (upgrade='0' ".iif($thismemberinfo[type]==1," or upgrade='1'").") ORDER BY $orderby $type");
    2) pagina con group by e il max (amount) ma non capisco come mai selezionare un title con pamount di 0.30 anziche quello di 0.42



    codice:
    $sql=$Db1->query("SELECT *, MAX(pamount) FROM ptsuads WHERE title = 'Meetic Affinity' AND credits>'0' AND active='1' AND (country='' or country='$thismemberinfo[country]') AND (upgrade='0' ".iif($thismemberinfo[type]==1," or upgrade='1'").") GROUP BY title ORDER BY $orderby $type");
    A questo punto penso che ci sia qualche conflitto di query ma non capisco dove e come risolverlo, spero che puoi aiutarmi.

    Inutile aggiungerti che ho provato anche sostituendo il select * indicando i singoli nomi delle tabelle ma il risultato non cambia.

    Ti ringrazio per aiuto

  10. #10
    Per venirne a capo conviene che scrivi la query eseguita (non il codice che la crea!!) e ci fornisci un dump della tabella, altrimenti diventa complicato.


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.