[Mysql] Between maar dan andersom

Pagina: 1
Acties:

  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

Topicstarter
Ben al een tijd opzoek naar een oplossing van het volgende probleem.

Database voorbeeld:
1 3
2 5
3 10
4 16
5 19

Ik heb een waarde bijvoorbeeld 7. Nu wil ik het getal krijgen dat het dichts eronder ligt (5) en het getal erboven ligt (10).

Dit kan natuurlijk gedaan worden door gebruik te maken van 2 query's maar is er ook een mogelijkheid om dit in 1 query te doen?

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
als je 2 waardes wilt, worden het volgens mij 2 query's (in dit geval)

SELECT MAX(...)
FROM ...
WHERE .. < 7

en dan eentje
SELECT MIN(...)
FROM ...
WHERE .. > 7

This message was sent on 100% recyclable electrons.


  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

Topicstarter
Dat zou idd de simpelste oplossing wezen.

Maar ben toch zeer nieuwsgierig of het in 1 kan ;)

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 18-04 07:52

edeboeck

mie noow noooothing ...

Stel dat de waarden in het veld "getal" zitten in de tabel "tabel". Je richtgetal is richtgetal.
Je kan onderstaande code nog aanpassen als je wil dat de grens inclusief is (als het getal zelf er ook in zit).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  Max(getal)
FROM
  tabel
WHERE
  getal<richtgetal
UNION
SELECT
  MIN(getal)
FROM
  tabel
WHERE
  getal>richtgetal


Ik weet dat het een beetje artificieel lijkt, maar dit is wel degelijk 1 SQL statement.

  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

Topicstarter
Super het werkt gewoon (y)
thnx voor de hulp Edeboeck

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 23:26
Dat kan wel met een creatieve group by enzo...
code:
1
2
3
4
5
6
SELECT 
  MIN(values) as min 
  MAX(values) as max 
  IF(values < 7, 'min', 'max') as identifier 
FROM table 
GROUP BY identifier

Geeft de minimum en maximum waarde voor de groep kleiner dan en groter dan 7 als ik me niet vergis...

[ Voor 18% gewijzigd door T-MOB op 30-09-2005 16:32 ]

Regeren is vooruitschuiven


  • disjfa
  • Registratie: April 2001
  • Laatst online: 08-01 11:17

disjfa

be

Waarom doe je niet gewoon NOT BETWEEN :?

Dat lijkt mij toch ook het tegenovergestelde van BETWEEN 8)7

disjfa - disj·fa (meneer)
disjfa.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
disjfa schreef op vrijdag 30 september 2005 @ 16:37:
Waarom doe je niet gewoon NOT BETWEEN :?

Dat lijkt mij toch ook het tegenovergestelde van BETWEEN 8)7
Maar dan krijg je niet de resultaten die TS wil, je krijgt dan alle records die niet tussen de waardes liggen. Niet alleen de records die het dichts bij de waardes liggen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
disjfa schreef op vrijdag 30 september 2005 @ 16:37:
Waarom doe je niet gewoon NOT BETWEEN :?

Dat lijkt mij toch ook het tegenovergestelde van BETWEEN 8)7
Ok, geef jij dan even aan welke getallen er 'niet tussen 7' liggen? Beetje nadenken voor je reageert mag wel, hè! Je zit hier in een tech-forum.

Mr.X hieronder heeft wel gelijk; er is waarschijnlijk wel een vage hack te verzinnen, maar die is dan waarschijnlijk minder efficiënt dan twee losse queries; dan kun je beter die twee queries doen. De suggestie met UNION is wel nuttig omdat dat voorkomt dat je de queries in een transactie moet wrappen om een consistent resultaat te krijgen (al is het de vraag of dat voor jouw toepassing ueberhaupt uitmaakt).
T-MOB schreef op vrijdag 30 september 2005 @ 16:31:
Dat kan wel met een creatieve group by enzo...
code:
1
2
3
4
5
6
SELECT 
  MIN(values) as min 
  MAX(values) as max 
  IF(values < 7, 'min', 'max') as identifier 
FROM table 
GROUP BY identifier

Geeft de minimum en maximum waarde voor de groep kleiner dan en groter dan 7 als ik me niet vergis...
Volgens mij werkt dit voor geen meter; ik kan de SQL query in m'n hoofd al niet parsen en het lijkt me dat je, om twee waarden te vinden, toch al twee groeperingen moet maken en dat kan niet in een enkele query.

[ Voor 128% gewijzigd door Soultaker op 30-09-2005 16:45 ]


Verwijderd

@disjfa: semantisch heb je gelijk, maar dat is niet wat hij bedoelt. [/spuit11]

@facer: Ik begrijp niet waarom je dit persee in 1 query zou willen doen, want dat hoeft niet persee het meest efficient te zijn.

[ Voor 3% gewijzigd door Verwijderd op 30-09-2005 16:43 ]


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 23:26
Soultaker schreef op vrijdag 30 september 2005 @ 16:42:
Volgens mij werkt dit voor geen meter; ik kan de SQL query in m'n hoofd al niet parsen en het lijkt me dat je, om twee waarden te vinden, toch al twee groeperingen moet maken en dat kan niet in een enkele query.
Werkt prima als er comma's tussen de opgevraagde "velden" worden gezet. Misschien had ik beter niet "values" gebruikt om de kolom aan te duiden zodat je hem wel in je hoofd kon parsen ;).

Regeren is vooruitschuiven


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
Ah ja, ik zie 'm nu. Dat werkt inderdaad wel: eerst alle waarden indelen in een groep - 'groter' dan wel 'kleiner' dan 7 - en dan uit die twee groepen het minimum respectievelijk het maximum halen. Slim verzonnen, maar waarschijnlijk niet erg efficiënt. ;)

[ Voor 8% gewijzigd door Soultaker op 30-09-2005 17:31 ]

Pagina: 1