Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    MySql - Semplificare una query molto complessa

    Buonasera a tutti,

    pongo alla vostra gentile attenzione il mio quesito.

    il mio sito web contiene una form che esegue una ricerca (circa 600 volte al giorno) su una tabella di nome PIPPO, contenente 3mila record e strutturata come segue:

    codice:
    Obj_id | value_id	| BoolSet
    
    1	| 2		|  1
    1	| 42		|  1
    1	| 25		|  1
    1	| 45		|  1
    
    2	| 2		|  1
    2	| 45		|  0
    
    3	| 2		|  1
    3	| 42		|  1
    3	| 25		|  1
    3	| 45		|  1
    
    4	| 2		|  0
    4	| 42		|  0
    4	| 25		|  1
    4	| 45		|  1
    
    5	| 45		|  1
    
    6	| 2		|  1
    Tramite la seguente query:

    codice:
    SELECT * FROM  (SELECT A.`Obj_id ` AS ID1_OBJ FROM PIPPO AS A, PIPPO AS B, PIPPO AS C, PIPPO AS D 
     WHERE 1=1 
     AND A.` Obj_id ` =B.`Obj_id `
     AND B.`Obj_id ` =C.`Obj_id `
     AND C.`Obj_id ` =D.`Obj_id `
     AND A.`value_id`=2 AND A.` BoolSet `=1
     AND B.`value_id`=42 AND B.` BoolSet `=1
     AND C.`value_id`=25  AND C.`valore`=1
     AND D.`value_id`=45 AND D.` BoolSet `=1
    )
    Ottengo:
    la lista di valori della colonna Obj_id che hanno la colonna value_id=2 and 42 and 25 and 45 and colonna BoolSet =1
    In questo caso Il risultato sarà: (1,3)

    La colonna value_id potrebbe assumere fino a 10 diversi valori, in tal caso se volessi ottenere:
    la lista di valori della colonna Obj_id che hanno la colonna value_id=2 and 42 and 25 and ..(fino a 10) and colonna BoolSet =1
    la mia query dovrebbe essere sviluppata con 10 prodotti cartesiani della stessa tabella.

    Quello che chiedo è, la mia query:
    - è performante ?
    - esiste un modo migliore/più sintetico di svilupparla?

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Questa è ottimizzata per un altro DB
    prendila solo come idea da ottimizzare per MySql


    codice:
    SELECT 
    PIPPO.OBj_id
    FROM 
    PIPPO
    GROUP BY 
    PIPPO.OBj_id
    HAVING 
    (((Sum(
    IIf([PIPPO]![value_id]=2 And [PIPPO].[Boolset]=True,1,0)
    +
    IIf([PIPPO]![value_id]=25 And [PIPPO].[Boolset]=True,1,0)
    +
    IIf([PIPPO]![value_id]=42 And [PIPPO].[Boolset]=True,1,0)
    +
    IIf([PIPPO]![value_id]=45 And [PIPPO].[Boolset]=True,1,0)
    ))=4))
    ;
    Facci sapere

    .

  3. #3
    Ciao nman,

    grazie per aver risposto al mio post.

    La tua tua query funziona correttamente, ed è: semplice da leggere, scalabile, veloce. Davvero fantastica!
    C'ho ragionato un mese e non mi è venuto in mente nient'altro che una serie infinita di prodotti cartesiani. Sono proprio scarso

    Grazie e...
    Shapò

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.