Toon posts:

[sql] query hulp gevraagd

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben bezig met een online agenda, op zich gaat alles naar behoren, echter het volgende.
De taken in de agenda zijn rijen in een tabel, `opties`.
Een voorbeeld van een drietal opties in de tabel:

naambegineind
test1100200
test2150250
test3350500


De velden `begin` en `eind` zijn timestamps, echter voor het voorbeeld even verkleind naar 100-tallen.

De kwestie;
Ik wil met 1 query de opties selecteren die elkaar overlappen. In dit voorbeeld zouden dat test1 en test2 zijn, aangezien test2 begint (=150) tussen het begin en eind (resp. 100 en 200) van test1.

Is dit te doen met 1 query? Ik zou bij God niet weten hoe en heb ook werkelijk geen idee hoe ik het aan zou moeten pakken qua sql.

Oplossing is wel om alle rijen te controleren met een while-statement, en om vervolgens de waarden die overlappen in een array te zetten, zoals ik nu doe.
Is dit te voorkomen met een bepaalde query die de betreffende ID's returned of moet ik vasthouden aan mijn array constructie?!

Ik hoef zeker geen kant en klare query, ik wil alleen even weten of dit makkelijker te doen is met een query i.p.v. een array constructie zoals die nu gehanteerd wordt.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ja, dit is vrij eenvoudig met sql te doen.
Je krijgt dan zoiets (niet getest):
code:
1
2
3
SELECT o1.naam, o1.begin, o1.eind, o2.naam, o2.begin, o2.eind
FROM opties AS o1
INNER JOIN opties AS o2 ON (o2.begin < o1.eind AND o2.eind > o1.begin)

Never underestimate the power of


Verwijderd

code:
1
2
3
4
select O1.NAAM 
from OPTIES O1
where O1.begin >= (select O2.begin from OPTIES O2 where O2.naam != O1.naam and O1.begin <= O2.eind)
OR    O1.eind <= ( select  O3.eind from OPTIES O3 where o3.naam != O1.naam and O1.eind <= O3.begin)


Zoiets? Zal niet de eindoplossing zijn want even uit het hoofd gedaan hoor.

Verwijderd

Spuit 11, grrr ;)

Verwijderd

Ik had laatst zo'n zelfde probleem, en dat heb ik als volgt opgelost

Als eerste heb ik alle mogelijkheden waarop 2 bereiken ten opzichte van elkaar kunnen liggen bij gewoon op een stukje papier getekend, dat zijn er 7

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
(1)
|   A   |
           |   B   |

(2)
|   A   |
   |   B   |

(3)
|   A   |
|   B   |

(4)
|      A      |
   |   B   |

(5)
   |   A   |
|      B      |

(6)
   |   A   |
|   B   |

(7)
           |   A   |
|   B   |


dit kun je dan gebruiken om je query op te bouwen. TIP : Gezien het feit dat er 5 mogelijkheden zijn die je wel wilt hebben, en maar 2 mogelijkheden die je NIET wilt, is het het makkelijkst om alle te selecteren waarvoor die mogelijkheden die je niet wilt ( 1 en 7 in mijn voorbeeld ) NIET gelden.