(My)SQL is niet mijn sterkste kant blijkt. Ik kan me er aardig mee redden en Queries die ik maak waarmee ik iets wil bereiken zijn vreselijk traag of geven mij niet de juiste informatie terug. Wellicht dat jullie mij hier een beetje mee op weg kunnen helpen zodat ik weer wat verder kan.
Situatie:
Op een bepaald moment is er een "event". Dit event heeft een bepaalde omschrijving (bijv. "Feestje"). Deze wordt opgeslagen in de event_tabel. Daarnaast zijn er mensen betrokken bij dit feestje. De id's daarvan worden opgeslagen in een koppeltabel (betrokkenen_tabel). Er kunnen uiteraard meerdere mensen op dit event zijn. Als laatste is er een tabel met de betrokkenen en hun naam.
Wat makkelijk te bereiken is is te zoeken bij welke events bijv. persoon nr 103 betrokken is.
Maar wat ik wil is als volgt: ik wil op basis van een combinatie van aanwezige personen (opgeslagen in zoektabel met uniek id) een lijst krijgen van de events waar zij aanwezig zijn PLUS alle andere mensen die ook op die events aanwezig zijn. Dit gesorteerd op nieuwste events eerst. In de praktijk bevatten de tabellen miljoenen records waarbij voor elk event er meerdere mensen aanwezig zijn. Het aantal unieke mensen is ca. 100.000.
Oftewel in bovenstaand voorbeeld: zoektabel(1) = 101,103 dus alle events waar personen 101 en 103 geweest zijn incl. alle bezoekers.
Dus resulaat van deze query moet zijn:
Het is me gelukt om de lijst van events te krijgen maar niet ook nog'ns met alle andere mensen die ook op die events zijn.
Ik had eerst iets als:
Dat werkt maar LOEITRAAG. Ik hoop dat het voorbeeld een beetje duidelijk is. Wat doe ik fout of wat kan beter? Wellicht zelfs de hele structuur overhoop gooien? Ik wil dat deze z.s.m. reageert, maar zeker binnen 1 seconde.
Overigens zijn overal indexes op aangemaakt. GEEN foreign keys gedefinieerd, dat wilde ik doen nadat de query gewoon uberhaupt een beetje loopt.
Situatie:
Op een bepaald moment is er een "event". Dit event heeft een bepaalde omschrijving (bijv. "Feestje"). Deze wordt opgeslagen in de event_tabel. Daarnaast zijn er mensen betrokken bij dit feestje. De id's daarvan worden opgeslagen in een koppeltabel (betrokkenen_tabel). Er kunnen uiteraard meerdere mensen op dit event zijn. Als laatste is er een tabel met de betrokkenen en hun naam.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| events_tabel:
id - MEDIUMINT
event_datumtijd - DATETIME
event_omschrijving - tinytext
betrokkenen_tabel:
events_tabel_id = MEDIUMINT (-> events_tabel.id)
persoon_tabel_id - MEDIUMINT (-> persoon_tabel.id)
persoon_tabel:
id - MEDIUMINT
naam - tinytext
zoektabel:
id - MEDIUMINT
persoon_tabel_id - MEDIUMINT (-> persoon_tabel.id)
Vulling events_tabel
1, 2013-12-21 10:11:12, 'Test'
2, 2013-12-22 18:00:00, 'Test 2'
3, 2013-12-23 19:00:00, 'Test 3'
4, 2013-12-24 12:13:14, 'Test 4'
Vulling betrokkenen_tabel:
1, 100
1, 101
2, 101
2, 109
3, 109
4, 102
4, 103
4, 109
4, 110
Vulling persoon_tabel:
100, 'Ik'
101, 'Jij'
102, 'Hij'
103, 'Zij'
109, 'Wij'
110, 'Jullie'
Vulling zoektabel:
1, 100
1, 101 |
Wat makkelijk te bereiken is is te zoeken bij welke events bijv. persoon nr 103 betrokken is.
Maar wat ik wil is als volgt: ik wil op basis van een combinatie van aanwezige personen (opgeslagen in zoektabel met uniek id) een lijst krijgen van de events waar zij aanwezig zijn PLUS alle andere mensen die ook op die events aanwezig zijn. Dit gesorteerd op nieuwste events eerst. In de praktijk bevatten de tabellen miljoenen records waarbij voor elk event er meerdere mensen aanwezig zijn. Het aantal unieke mensen is ca. 100.000.
Oftewel in bovenstaand voorbeeld: zoektabel(1) = 101,103 dus alle events waar personen 101 en 103 geweest zijn incl. alle bezoekers.
Dus resulaat van deze query moet zijn:
code:
1
2
3
4
5
6
| event_tabel.id, event_tabel.datumtijd, persoon_tabel.id, persoon_tabel.naam 2, 2013-12-22 18:00:00, 'Test 2', 101, 'Jij' (want deze persoon was gequeried vanuit zoektabel) 2, 2013-12-22 18:00:00, 'Test 2', 109, 'Wij' (want deze persoon was ook aanwezig maar niet in zoektabel!) 1, 2013-12-21 10:11:12, 'Test', 101, 'Jij' (omdat deze persoon gequeried was vanuit zoektabel) 1, 2013-12-21 10:11:12, 'Test', 100, 'Ik' (deze was ook gequeried vanuit zoektabel) |
Het is me gelukt om de lijst van events te krijgen maar niet ook nog'ns met alle andere mensen die ook op die events zijn.
Ik had eerst iets als:
code:
1
2
3
4
5
6
7
8
| SELECT events_tabel.event_datumtijd FROM events_tabel LEFT JOIN betrokkenen_tabel ON events_tabel.id = betrokkenen_tabel.events_tabel.id LEFT JOIN persoon_tabel ON persoon_tabel.id = betrokkenen_tabel.persoon_tabel_id WHERE betrokkenen_tabel.persoon_tabel_id IN ( SELECT persoon_tabel_id FROM zoektabel WHERE id = 1 ) ORDER BY events_tabel.event_datumtijd DESC |
Dat werkt maar LOEITRAAG. Ik hoop dat het voorbeeld een beetje duidelijk is. Wat doe ik fout of wat kan beter? Wellicht zelfs de hele structuur overhoop gooien? Ik wil dat deze z.s.m. reageert, maar zeker binnen 1 seconde.
Overigens zijn overal indexes op aangemaakt. GEEN foreign keys gedefinieerd, dat wilde ik doen nadat de query gewoon uberhaupt een beetje loopt.
[ Voor 0% gewijzigd door triet op 24-12-2013 19:10 . Reden: Paar typo's gefixed ]