Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346

    MYSQL => SELECT con LIMIT

    Salve,

    ho questo tipo di problema, ho un migliaia di righe in una tabella dove ogni riga ha una proprio tipo ed un totale. Dovrei selezionare per ogni tipo che ha un totale > X al massimo 10 righe.
    Ce un modo di fare una select unica? Ho provato cn varie SELECT cn relative subquery ma nn riesco a venirne fuori. Consigli? Grazie

    codice:
    SELECT * FROM tab WHERE tipo IN (SELECT tipo FROM tab WHERE totale > 30 GROUP BY tipo)
    ma ha il problema che ne seleziona + di 10 per ogni tipo.
    Per gli Spartani e Sparta usa spartan Il mio github

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    select id,tipo,totale
    from (
    	select
    	id,tipo,totale,
    	if(@prec!=tipo,@riga:=1,@riga:=@riga+1) as pos,
    	@prec:=tipo
    	from tab t1
    	inner join (select @riga:=null, @prec:=0) as r
    	order by t1.tipo,t1.totale desc
          )	as t2
    where pos <= 10 and totale > 30
    order by tipo,id;

  3. #3
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    ok grazie funge, vorrei aggiungere una piccola modifica nel caso io nn avessi le 10 righe se cambio l'inner join cn left join ottengo le rimanenti nulle? Cm potrei fare per questo? Grazie ancora
    Per gli Spartani e Sparta usa spartan Il mio github

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Bisognerebbe modificare alcune cose e usare una tabella con tutti i numeri progressivi da mettere in join.
    E' fattibile ma non ne vedo l'utilità.

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    A parte l'utilita', detto in verita ci sn tanti numeri che nn servirebbe , ma era x capire se il left, restituendo cmq righe NULL, avesse funzionato.
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Come ti accennavo ti serve una tabella con un solo campo (nel mio esempio tabella di nomer serie con un campo di nome i) che conterrà una sequenza di numeri progressivi abbastanza grande da coprire tutto il range dei tuoi record.
    Giocando con le variabili creerai una sequenza particolare. Se ad esempio il primo gruppo contiene solo 7 record, la variabile assumerà valori da 1 a 7, per il secondo gruppo il conteggio partirà da 11 e così via.
    In questo modo tramite un left join puoi creare le righe mancanti limitando la ricerca al numero di tipi distinti moltiplicato per 10.

    codice:
    select s.*,t3.*
    from serie as s
    left join ( 
    select id,tipo,totale,pos,((cum*10)+pos)-10 as deca,cum
    from (
    	select
    	id, tipo,totale,
    	if( @prec!=tipo,@riga:=1,@riga:=@riga+1) as pos,
    	if( @prec=tipo,@x,@x:=@x+1) as cum,
    	@prec := tipo
    	from tab t1
    	inner join (select @riga:=null, @prec:=0, @x:=0) as r
    	order by t1.tipo,t1.totale desc
          )	as t2
    where pos <= 10 and totale > 30
    ) as t3
    on s.i = t3.deca
    where s.i <= (select count(distinct(tipo))*10 from tab ) 
    order by s.i
    Come vedi è fattibilissimo ma a mio modesto avviso del tutto inutile e macchinoso.

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.