|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[SQL] Query onerosa
Ciao a tutti!
Ho bisogno di eseguire una query che, date la tabella Utenti(id,nickname,sesso,citta,paese) Libri(idu,titolo,autore) (dove idu è l'id utente che ha quel libro) mi tiri fuori tutte le coppie di utenti che hanno libri in comune. Ad esempio, se la tabella utenti è fatta così: Codice:
id nickname ecc. (tutti gli altri campi) 0 utente0 1 utente1 2 utente2 Codice:
idu titolo autore 0 libro1 autore1 0 libro2 autore2 0 libro3 autore3 0 libro4 autore4 1 libro2 autore2 1 libro6 autore6 2 libro1 autore1 2 libro3 autore3 2 libro6 autore6 Codice:
id1 nickname1 id2 nickname2 NumLibriComune 0 utente0 1 utente1 1 0 utente0 2 utente2 2 1 utente1 2 utente2 1 select u1.id, u1.nickname, u2.id, u2.nickname from utenti u1, utenti u2 where u1.id<>u2.id il consumo di memoria (visto da Task Manager) è arrivato a 400MB. Una cosa del genere in SQL è possibile farla? Posso anche evitare di segnarmi l'attributo NumLibriComune, però in quel caso ci devono essere tante coppie quanti sono i libri in comune. Spero di essere stato chiaro.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Innanzitutto vedo un problema.
Ovviamente la chiave primaria di Libri non e' solo idu, altrimenti significherebbe che ciascun utente puo' avere un solo libro. Oppure idu non e' la chiave dell'utente, ma solo quella del libro, e da qualche altra parte esiste un'associativa che lega insieme libri e utenti (che sarebbe anche la cosa migliore)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
In realtà mi basterebbero anche solo gli id degli utenti, quindi posso usare anche solo la tabella libri. In tal caso ho provato a eseguire la seguente query:
Codice:
select l1.idu, l2.idu from libri l1, libri l2 where l1.idu<>l2.idu and l1.titolo like l2.titolo ![]()
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Allora infatti ho sbagliato a scrivere idu non è chiave primaria (Libri in realtà non ha una chiave primaria). Inoltre non c'è alcuna tabella associativa che lega libri e utenti. Purtroppo questo database non l'ho fatto io.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
E allora vediamo se possiamo mettercela. Data una coppia (idu, titolo), quanti record possiamo trovare nella tabella libri? 1 o piu' di 1?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Data una coppia (idu,titolo) ne possiamo trovare solo 1. Quindi dici che quella può essere una chiave primaria?
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
(Idu, titolo) sulla tabella Libro Di aggiungere anche un indice unico (titolo,IDU) (sempre se te lo fa fare, dopo aver fatto gia' quella chiave primaria) e poi di eseguire la Codice:
SELECT L1.ID,L2.ID,COUNT(*) FROM Libri L1, Libri L2 WHERE L2.ID>L1.ID AND L1.titolo = L2.titolo GROUP BY L1.ID, L2.ID
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ho provato ad aggiungere la chiave primaria (idu,titolo) ma mi dice che non è unique
![]() Update: ho scoperto perché. Ci sono alcune righe duplicate (come era ovvio che fosse).
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson Ultima modifica di Manugal : 30-01-2009 alle 12:38. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Prova comunque ad aggiungere i 2 indici non univoci, ed eseguire la query di prima. La quale conterebbe pero' 6 un libro letto 2 volte dal primo utente e 3 volte dal secondo utente.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Allora ho scoperto che non è possibile che (idu,titolo) sia una chiave primaria, perché a quanto pare ci sono libri con lo stesso titolo posseduti dallo stesso utente ma scritti da autori diversi. Un'altra soluzione invece di rendere (idu,titolo) chiave primaria?
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ho provato ad aggiungere i due indici (uno per idu e uno per titolo) e ad eseguire quella query, ma non termina mai.
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
(idu, titolo) e (titolo, idu) Sono indici doppi, su 2 colonne.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ok, ora funziona e mi ritorna correttamente tutto. Ho aspettato circa 3 minuti e mezzo, cosa che prima non ho fatto (quindi credo che anche prima avrebbe funzionato). Vorrei sapere però che cosa ci avrei guadagnato se avessi avuto (idu,titolo) come chiave primaria. Era più semplice la query?
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ho capito, grazie mille per l'aiuto
![]()
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:01.