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

    [Mysql] raggruppare ogni Tot righe

    Dal forum di php mi hanno giustamente consigliato di chiedere qui...

    Espongo il dilemma...

    Ho una tabella mysql con migliaia e migliaia di record (sono tutti numeri impostati come decimal).

    Vorrei fare questo:
    - selezionare tutto
    - fare gruppi da 40 righe ciascuno (partendo dall'ultimo record, andando indietro, e se non ho l'ultimo gruppo da 40 righe lo lascio perdere)
    - e per ogni gruppo
    -- calcolarne/mostrarne: il primo valore, il 40esimo valore, il più alto, il più basso

    (possibilmente senza toccare il db aggiungendo tabelle temporanee)
    Fantasupermegafavolipermeramagicultra irresistibili
    4 10 30 100 1001 personaggi insuperabili fantaincredibili ultraimpossibili iperterribili irresistibili!!!

    "... a quell'età ... bastava un dito per fare la pace ..."
    fotine

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Ho fatto questa prova estraendo da una tabella gli ultimi 190 record in modo da non avere cifra tonda ed escludere gli ultimi 30.


    codice:
    select
    concat_ws('-',riga,riga+39) as intervallo,
    count(id) as quanti,
    min(id) as primo,
    max(id) as ultimo,
    min(num) as minore,
    max(num) as maggiore
     from (
    select @riga:=@riga+1 as riga, 
    id,num from tabella,
    (select @riga:=0) as r order by id desc limit 190) as tab
    group by ceil(riga/40)
    having quanti = 40

  3. #3
    Originariamente inviato da nicola75ss
    Ho fatto questa prova estraendo da una tabella gli ultimi 190 record in modo da non avere cifra tonda ed escludere gli ultimi 30.
    ...
    Sto provando ad applicarla... Mi pare che non funzioni bene "primo" e "ultimo"
    Fantasupermegafavolipermeramagicultra irresistibili
    4 10 30 100 1001 personaggi insuperabili fantaincredibili ultraimpossibili iperterribili irresistibili!!!

    "... a quell'età ... bastava un dito per fare la pace ..."
    fotine

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da ricman
    Sto provando ad applicarla... Mi pare che non funzioni bene "primo" e "ultimo"
    Per primo e ultimo io ho inteso gli id minore e maggiore di ciascun gruppo.

  5. #5
    Originariamente inviato da nicola75ss
    Per primo e ultimo io ho inteso gli id minore e maggiore di ciascun gruppo.
    Ah... quindi mostri l'id ... io devo mostrare 4 numeri (il primo dei 40, l'ultimo dei 40, il più alto tra i 40, il più basso tra i 40)

    Mi basta cambiare "id" con "num" oppure cambia qualche operazione? (scusa se la domanda è banale ma per me questa query è molto complessa...)
    Fantasupermegafavolipermeramagicultra irresistibili
    4 10 30 100 1001 personaggi insuperabili fantaincredibili ultraimpossibili iperterribili irresistibili!!!

    "... a quell'età ... bastava un dito per fare la pace ..."
    fotine

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da ricman
    Ah... quindi mostri l'id ... io devo mostrare 4 numeri (il primo dei 40, l'ultimo dei 40, il più alto tra i 40, il più basso tra i 40)

    Mi basta cambiare "id" con "num" oppure cambia qualche operazione? (scusa se la domanda è banale ma per me questa query è molto complessa...)
    Nella tabella che ho usato per testare la query ho selezionato solo due campi, l'id che è la chiave primaria e un campo num che contiene dei valori interi.

    I 4 risultati sono questi

    min(id) as primo,
    max(id) as ultimo,
    min(num) as minore,
    max(num) as maggiore

    Quindi ho inteso con min(num) il più basso dei 40, con max(num) il più alto dei 40 mentre per primo e ultimo dei 40 ho inteso gli id. Tu ti riferivi ad altro?

  7. #7
    Originariamente inviato da nicola75ss
    Nella tabella che ho usato per testare la query ho selezionato solo due campi, l'id che è la chiave primaria e un campo num che contiene dei valori interi.

    I 4 risultati sono questi

    min(id) as primo,
    max(id) as ultimo,
    min(num) as minore,
    max(num) as maggiore

    Quindi ho inteso con min(num) il più basso dei 40, con max(num) il più alto dei 40 mentre per primo e ultimo dei 40 ho inteso gli id. Tu ti riferivi ad altro?
    Scusa se ti rispondo solo ora... Ho avuto qualche piccola distrazione.

    Si, intendevo altro...

    Abbiamo selezionato gli intervalli di 40 righe ciascuno. Fin qui OK.

    Prendiamo uno di questi intervalli e ricordiamo che il campo NUM è un numero (decimal).
    I calcolo li vorrei fare tutti sul campo NUM.
    Quindi vorrei
    - il primo numero delle 40 righe (la riga 1 di 40)
    - l'ultimo numero delle 40 righe (la riga 40 di 40
    - il valore massimo di NUM tra i 40 dell'intervallo
    - il valore minimo di NUM tra i 40 dell'intervallo

    Spero di essermi spiegato meglio...


    Riepilogo qui la query che stavamo provando:

    codice:
    SELECT
    	CONCAT_WS('-',riga,riga+39) AS intervallo,
    	COUNT(id) AS quanti,
    	MIN(id) AS primo,
    	MAX(id) AS ultimo,
    	MIN(num) AS minore,
    	MAX(num) AS maggiore
    FROM (
    	SELECT @riga:=@riga+1 AS riga, 
    	id,num from Tabella,
    	(SELECT @riga:=0) AS r ORDER BY id desc limit 190) AS tab
    	GROUP BY CEIL(riga/40)
    	HAVING quanti = 40
    Ovviamente se sostituisco a "MIN(id) AS primo" id con num la cosa non va bene...
    Fantasupermegafavolipermeramagicultra irresistibili
    4 10 30 100 1001 personaggi insuperabili fantaincredibili ultraimpossibili iperterribili irresistibili!!!

    "... a quell'età ... bastava un dito per fare la pace ..."
    fotine

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Puoi postare un dump di una ventina di righe?

  9. #9
    codice:
    -- phpMyAdmin SQL Dump
    -- version 3.2.5
    -- http://www.phpmyadmin.net
    --
    -- Host: localhost
    -- Generato il: 08 feb, 2011 at 12:21 PM
    -- Versione MySQL: 5.1.44
    -- Versione PHP: 5.3.2
    
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    
    --
    -- Database: `prova`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `TEST`
    --
    
    CREATE TABLE IF NOT EXISTS `TEST` (
      `id` int(16) NOT NULL AUTO_INCREMENT,
      `num` decimal(20,10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=105714 ;
    
    --
    -- Dump dei dati per la tabella `TEST`
    --
    INSERT INTO `TEST` VALUES(105650, 1355.9100341800);
    INSERT INTO `TEST` VALUES(105651, 1356.0100097700);
    INSERT INTO `TEST` VALUES(105652, 1356.0100097700);
    INSERT INTO `TEST` VALUES(105653, 1355.8000488300);
    INSERT INTO `TEST` VALUES(105654, 1355.8000488300);
    INSERT INTO `TEST` VALUES(105655, 1355.6999511700);
    INSERT INTO `TEST` VALUES(105656, 1355.6500244100);
    INSERT INTO `TEST` VALUES(105657, 1355.4899902300);
    INSERT INTO `TEST` VALUES(105658, 1355.4899902300);
    INSERT INTO `TEST` VALUES(105659, 1355.7900390600);
    INSERT INTO `TEST` VALUES(105660, 1355.7800293000);
    INSERT INTO `TEST` VALUES(105661, 1355.7399902300);
    INSERT INTO `TEST` VALUES(105662, 1355.5000000000);
    INSERT INTO `TEST` VALUES(105663, 1355.6300048800);
    INSERT INTO `TEST` VALUES(105664, 1355.6400146500);
    INSERT INTO `TEST` VALUES(105665, 1355.6800537100);
    INSERT INTO `TEST` VALUES(105666, 1355.6800537100);
    INSERT INTO `TEST` VALUES(105667, 1355.6899414100);
    INSERT INTO `TEST` VALUES(105668, 1355.4100341800);
    INSERT INTO `TEST` VALUES(105669, 1355.1500244100);
    INSERT INTO `TEST` VALUES(105670, 1355.5000000000);
    INSERT INTO `TEST` VALUES(105671, 1355.4799804700);
    INSERT INTO `TEST` VALUES(105672, 1355.4200439500);
    INSERT INTO `TEST` VALUES(105673, 1355.3599853500);
    INSERT INTO `TEST` VALUES(105674, 1355.3599853500);
    INSERT INTO `TEST` VALUES(105675, 1354.8000488300);
    INSERT INTO `TEST` VALUES(105676, 1354.6999511700);
    INSERT INTO `TEST` VALUES(105677, 1355.1700439500);
    INSERT INTO `TEST` VALUES(105678, 1355.1700439500);
    INSERT INTO `TEST` VALUES(105679, 1355.1099853500);
    INSERT INTO `TEST` VALUES(105680, 1355.0899658200);
    INSERT INTO `TEST` VALUES(105681, 1355.0999755900);
    INSERT INTO `TEST` VALUES(105682, 1355.0999755900);
    INSERT INTO `TEST` VALUES(105683, 1355.0799560500);
    INSERT INTO `TEST` VALUES(105684, 1355.0799560500);
    INSERT INTO `TEST` VALUES(105685, 1355.1099853500);
    INSERT INTO `TEST` VALUES(105686, 1355.1099853500);
    INSERT INTO `TEST` VALUES(105687, 1354.6500244100);
    INSERT INTO `TEST` VALUES(105688, 1354.8199462900);
    INSERT INTO `TEST` VALUES(105689, 1354.9300537100);
    INSERT INTO `TEST` VALUES(105690, 1354.9300537100);
    INSERT INTO `TEST` VALUES(105691, 1354.8199462900);
    INSERT INTO `TEST` VALUES(105692, 1354.8100585900);
    INSERT INTO `TEST` VALUES(105693, 1354.9399414100);
    INSERT INTO `TEST` VALUES(105694, 1354.8199462900);
    INSERT INTO `TEST` VALUES(105695, 1354.9100341800);
    INSERT INTO `TEST` VALUES(105696, 1355.0100097700);
    INSERT INTO `TEST` VALUES(105697, 1354.9300537100);
    INSERT INTO `TEST` VALUES(105698, 1354.9300537100);
    INSERT INTO `TEST` VALUES(105699, 1354.9100341800);
    INSERT INTO `TEST` VALUES(105700, 1355.1899414100);
    INSERT INTO `TEST` VALUES(105701, 1355.0999755900);
    INSERT INTO `TEST` VALUES(105702, 1355.0999755900);
    INSERT INTO `TEST` VALUES(105703, 1355.2399902300);
    INSERT INTO `TEST` VALUES(105704, 1355.0000000000);
    INSERT INTO `TEST` VALUES(105705, 1355.5699462900);
    INSERT INTO `TEST` VALUES(105706, 1355.5699462900);
    INSERT INTO `TEST` VALUES(105707, 1355.5999755900);
    INSERT INTO `TEST` VALUES(105708, 1355.7900390600);
    INSERT INTO `TEST` VALUES(105709, 1355.9599609400);
    INSERT INTO `TEST` VALUES(105710, 1355.9599609400);
    INSERT INTO `TEST` VALUES(105711, 1356.2500000000);
    INSERT INTO `TEST` VALUES(105712, 1355.9300537100);
    INSERT INTO `TEST` VALUES(105713, 1355.9599609400);
    Fantasupermegafavolipermeramagicultra irresistibili
    4 10 30 100 1001 personaggi insuperabili fantaincredibili ultraimpossibili iperterribili irresistibili!!!

    "... a quell'età ... bastava un dito per fare la pace ..."
    fotine

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Ok. Sono 64 record. Supponiamo per praticità di raggruppare ogni 25 righe ordinando in senso decrescente. Escluderemo quindi i primi 14 record.

    Il risultato della query è:

    codice:
    mysql> select
        ->  concat_ws('-',riga,riga+24) as intervallo,
        ->  count(id) as quanti,
        ->  min(id) as primo,
        ->  max(id) as ultimo,
        ->  min(num) as minore,
        ->  max(num) as maggiore
        -> from (
        ->  select @riga:=@riga+1 as riga,
        ->  id,num from test,
        ->  (select @riga:=0) as r order by id desc) as tab
        ->  group by ceil(riga/25)
        ->  having quanti = 25;
    +------------+--------+--------+--------+-----------------+-----------------+
    | intervallo | quanti | primo  | ultimo | minore          | maggiore        |
    +------------+--------+--------+--------+-----------------+-----------------+
    | 1-25       |     25 | 105689 | 105713 | 1354.8100585900 | 1356.2500000000 |
    | 26-50      |     25 | 105664 | 105688 | 1354.6500244100 | 1355.6899414100 |
    +------------+--------+--------+--------+-----------------+-----------------+
    Tu invece cosa vuoi ottenere?

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.