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

    [mysql] problema recupero record

    Salve
    Dunque...ho una tabella che relaziona più tabelle
    Ora...devo trovare tutti gli id_tabella2 dove id_tabella_1 è (per esempio) 80, e ho SOLO una relazione con tabella 2.
    esempio
    codice:
    ID id_tabella1 id_tabella2
    2     80              90         
    3     80              234       
    4     80              32         
    5     80              143       
    6     90              143       
    7     75              90 
    8     54              87
    In pratica dovrebbe trovarmi gli ID 3 e 4 (il 2 no perchè, per id_tabella2 90, ho più di una relazione; il 5 no perchè id_tabella2 è presente due volte; il 6 come per il 5; il 7 come per il 2; il 8 no perchè id_tabella1 non è 80).
    Per essere precisi non mi servono gli ID ma gli id_tabella2 (quindi 234 e 32)

    Ci sto uscendo scemo

    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    non ho capito un granchè, come al solito, anche perchè nel frattempo sto facendo altri lavoretti.

    Comunque il primo modo (non efficiente con mysq) che mi viene in mente è questo

    codice:
    select * from tab where
    (idtab1=80) and
    (idtab2 in
    (select idtab2 from tab
    group by idtab2
    having count(*)=1))

  3. #3
    Originariamente inviato da franzauker
    non ho capito un granchè, come al solito, anche perchè nel frattempo sto facendo altri lavoretti.

    Comunque il primo modo (non efficiente con mysq) che mi viene in mente è questo

    codice:
    select * from tab where
    (idtab1=80) and
    (idtab2 in
    (select idtab2 from tab
    group by idtab2
    having count(*)=1))
    Hmmm...sta a vedere che la soluzione l'avevo davanti gli occhi e non me ne ero accorto...mi ero prodigato in super query annidate ipercomplesse con join ricorsive...

  4. #4
    L'ho provata ed è anche abbastanza efficente (usa correttamente gli indici).
    Ora devo controllare che i risultati siano giusti, ovvero faccia quel che spero faccia, ma a occhio sembra corretta!
    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    in realtà con mysql non è efficiente, per nulla.
    anzi è disastrosa fino alla 5.5.
    la query dentro la IN viene eseguita per ogni riga esterna, invece che una volta per tutte. Migliora (poco) con 5.5 e 5.6, ma è veramente pessima.

    Va bene se hai poche righe e/o una selettività molto elevata nelle condizioni della query esterna (che fa sì che quella interna sia eseguita poche volte).

    altrimenti lato applicazione "espandi" con group_concat gli ID della query interna, e fai una seconda query con IN su una lista statica.

    Questa invece è efficiente

  6. #6
    Originariamente inviato da franzauker
    Va bene se hai poche righe e/o una selettività molto elevata nelle condizioni della query esterna
    Esattamente quel che succede
    Comunque l'explain mi da questo (ragion per cui la ritengo efficente)
    codice:
    id 	select_type 	table 	type 	pos_keys key 	key_len ref 	rows 	Extra
    1 	PRIMARY 	abb	ref 	ID_M_U 	ID_M_U 	3 	const 	259 	Using where
    2 	DEP SUB 	abb 	index 	NULL 	 ID_S 	3 	NULL 	1 	Using index

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.