Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 43

Discussione: MYSQL: cerca valore più frequente ma con difficoltà in più...

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    732

    MYSQL: cerca valore più frequente ma con difficoltà in più...

    ho trovato tantissimi esempi di select che estraggano il valore più frequente da una colonna, esempio questa-->
    Codice PHP:
     SELECT       `colonna`
        
    FROM     `tabella`
        
    GROUP BY `colonna`
        
    ORDER BY COUNT(*) DESC
        LIMIT    10

    MA questa select funziona SE in ogni record di quella colonna c'è UNA sola parola o un solo numero. Invece se ho una situazione del genere-->

    ID COLONNA
    1 pippo pluto paperino
    2 pippo paperino
    3 pippo pluto topolino
    4 pippo pluto topolino
    5 pippo pluto paperino qui quo qua

    con quale select potrei avere il seguente risultato?-->

    pippo (perchè è presente il maggior numero di volte)
    pluto (perchè è presente un numero di volte inferiore a pippo)
    paperino (perchè è presente un numero di volte inferiore a pluto)
    topolino (perchè è presente un numero di volte inferiore a paperino)
    ecc ecc?

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Non credo sia possibile con una query SQL. D’altronde è facile con php.

    Fai una query normale.
    Per ogni valore di colonna fai uno split con il carattere che separa i dati. Percorri poi l’array che ne risulta e fai come segue.
    non testato.

    prima de ciclo
    Codice PHP:
    $conta = array(); 
    Nel ciclo
    Codice PHP:
    foreach($array as $valore)
    {
        
    $conta[$valore] = isset($conta[$valore]) ? $conta[$valore]+1:1;

    poi quando tutti i record sono stati trattati.
    Codice PHP:
    sort($conta); 
    Ultima modifica di badaze; 02-11-2018 a 09:44
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Funziona, ma potrebbe metterci una vita. L’alternativa è splittare in una tabella d’appoggio e eseguire la select su quella

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Ho scritto ‘con una query’. Certo che con una serie è fattibile.
    Comunque per metterci una vita ci vorrebbe una valanga di dati.

    @theseo. Quante righe hai ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    732
    eh no mannaggia ne ho una valangata, siamo ad oltre 140.000..............
    quindi tabella di appoggio?
    argh non lo so fare :-(

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Dipende da come vuoi e quando vuoi ottenere i dati. Se li vuoi all'istante allora è struttura dei dati da rivedere.

    Ho fatto una prova con delle tabelle. Premetto che c'è uno spazio tra gli elementi.
    Ci vogliono 2 tabelle temporanee. Entrambe hanno un campo id e commento.

    La tabella che contiene i dati grezzi si chiama tabella5. Stessa struttura dalle tabelle temporanee.

    Alla fine metto tutto in una tabella chiamata tabellaf ma normalmente temp2 contiene tutti gli elementi. tabellaf ha solo il campo commento.

    Forse optime ha un'altra soluzione.

    Codice PHP:
    $bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    // cancello i dati della tabella temporanea
    $deleteTemp1 "delete from temp1";
    $bdd->exec($deleteTemp1);
    // cancello i dati della tabella temporanea
    $deleteTemp2 "delete from temp2";
    $bdd->exec($deleteTemp2);
    // inserisco i dati da contare nella tabella temporanea
    $insertTemp1 ="insert into temp1 select * from tabella5";
    $bdd->exec($insertTemp1);
    // aggiungo uno spazion alla fine per essere sicuro di averne almeno 1
    $updateTemp1 ="UPDATE `temp1` SET temp1.commento = concat(temp1.commento,' ')";
    $bdd->exec($updateTemp1); 
    $limit 0;
    do
    {
        
    // inserisco il primo elemento di ogni riga
     
    $insertTemp2 ="insert into temp2 (id, commento) select id, substr(commento, 1, LOCATE(' ',`commento`)) from temp1";
     
    $bdd->exec($insertTemp2);
     
    // aggiorno la tabella temporanea togliendo il primo elemento
        
    $updateTemp1  ="UPDATE `temp1` SET temp1.commento = substr(commento, LOCATE(' ',`commento`)+1 )";
     
    $countUpdates $bdd->exec($updateTemp1);
     
     
    // conto i record che contengono soli spazi
     
    $queryConta  "select count(*) as conta from temp1 where commento = ''";
     
    $prepared  $bdd->prepare($queryConta);
     
    $prepared->execute();
     
    $row       $prepared->fetch(PDO::FETCH_ASSOC);
     
    // n° totale di ricordi che hanno soli spazi
     
    $count     $row['conta'];
     
    // questo per ovviare un ciclo eterno - in questo esempio al massimo ci sono 10 elementi al massimo
     // è possibile modificarlo a piacimento
     
    $limit++;
    } while (
    $count != $countUpdates && $limit 10);
    // cancellazione dati della tabella finale
    $deleteFinale "delete from tabellaf";
    $bdd->exec($deleteFinale);
    // inserisco tutti gli elementi singoli
    $insertFinal "insert into tabellaf (commento) select commento from temp2";
    $bdd->exec($insertFinal);
    // cancello i record con uno spazio
    $deleteFinale "delete from tabellaf where commento = ' '";
    $bdd->exec($deleteFinale);
    print 
    "done"
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    stavo provando, ma vedendo il tuo codice rinuncio

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    180
    su SQL esite STRING_SPLIT da usare STRING_SPLIT(stringa, separatore), e ti restituisce una tabella con n righe in base ai falori splittati (vuota se la stringa è null). Sinceramente non so se funzioni su MySql dovresti provare

    vedi questo link per la funzione (SQL)
    https://docs.microsoft.com/it-it/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017
    Riccardo Sadocchi
    Microsoft MCP C#

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jul 2002
    residenza
    Lyon
    Messaggi
    5,341
    Non l’ho vista su mysql. Peccato !
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    732
    allora eccomi caro badaze
    ho preso il tuo codice, ho messo i parametri del mio db, l'ho messo online su una pag php di prova, ho creato le 4 tabelle e il codice mi risponde DONE, quindi per adesso tutto ok
    ma ora sono nel marasma... abbiate pazienza ma sono un cavernicolo php over 55....
    devo fare la select e collegare il tuo codice con il campo che ha i dati da esaminare... non so farlo :-(
    mi aiutate ancora un pò? (pago birre... ma davvero!)

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 © 2018 vBulletin Solutions, Inc. All rights reserved.