Toon posts:

[MYSQL] Coordinaten als string en een Between

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo Tweakers,
Ik wil graag checken of een coordinaat binnen een bepaalde range ligt.

WHERE xy BETWEEN $xy AND $xy2

Nu zijn mijn coordinaten (xy) opgeslagen als volgt :

778_559
1920_1024

dit is nu mijn query :

SELECT * FROM mypages WHERE xy BETWEEN '7840_2000' AND '9600_3000'

of

SELECT * FROM mypages WHERE xy > '7840_2000' AND xy < '9600_3000'

Dit is een correcte query maar krijg niet de resultaten die ik wil zien.

Sql selecteerd ook de items met coordinaten '877_240' of '788_211'

Heb ook al dingen geprobeerd met mysql (left,right,replace) string functions om de string in een x coordinaat en y coordinaat te splitten maar dat wilde ook niet erg lukken.

Wie heeft er een idee?

[ Voor 4% gewijzigd door Verwijderd op 12-06-2008 14:40 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik :Y)
Mikker dat datamodel overboord want dat lijkt nergens op. Waarom zou je coordinaten in 1 veld als een string, gescheiden door een underscore, opslaan 8)7
Er is vast iets creatiefs te knutselen met de string-functies (en misschien wat UDF's enzo) maar dat gaat, zeker op grotere tabellen, voor geen meter performen en is gewoon een lompe pleister voor een gutsende wond van een datamodel :X
Wat is er mis met 2 int veldjes (itt tot een string waarin je dus 2 ints zet gescheiden door een underscore)?

[ Voor 9% gewijzigd door RobIII op 12-06-2008 14:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • pedorus
  • Registratie: Januari 2008
  • Niet online
x en y zijn eigenlijk aparte integers lijkt wel, dus sla ze ook gewoon zo op in de database? (Zie hierboven)

Mocht je op de een of andere manier het datamodel niet direct kunnen wijzigen, doe dan iets als (met substring_index):
SQL:
1
2
3
4
5
CREATE VIEW mypages2 AS 
   SELECT substring_index(xy,"_",1)*1 AS x, 
      substring_index(xy,"_",-1)*1 AS y,
      * 
   FROM mypages

En gebruik bij alle queries die view.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Topicstarter
Mikker dat datamodel overboord want dat lijkt nergens op. Waarom zou je coordinaten in 1 veld als een string, gescheiden door een underscore, opslaan
Ja, tis een experimenteel dingetje.
'3450_2000' is tegelijkertijd een id, om in de Dom aan te spreken. Hiervanuit ben ik begonnen en niet vanuit een goed plan. Later structureren was mn devies.

Maar idd kan ik het beter apart opslaan. Bedankt voor het lichtje.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 12 juni 2008 @ 16:02:
[...]


Ja, tis een experimenteel dingetje.
'3450_2000' is tegelijkertijd een id,
8)7
Als je dan je DOM opbouwt kun je dat *kuch* "id" toch gewoon alsnog samenstellen van die 2 ints?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op donderdag 12 juni 2008 @ 16:02:
Hiervanuit ben ik begonnen en niet vanuit een goed plan. Later structureren was mn devies.
Stel dat je nu wel een (ranzige) query gemaakt had die werkte, had je dan echt later uit jezelf de structuur netjes gemaakt? Datamodel moet gewoon zsm in de goede richting zijn, later ben je te veel gehecht aan al die queries (waar je veel tijd in hebt gestoken ivm slecht datamodel) die je moet breken bij wijzigingen.

En de motivatie voor je huidige structuur is idd nogal gammel. :P

{signature}


Verwijderd

-- Ahum MySql dus :) -

[ Voor 105% gewijzigd door Verwijderd op 13-06-2008 16:19 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Misschien kan je iets met een geohash (geohash.org).

Rustacean


  • remco_k
  • Registratie: April 2002
  • Laatst online: 23:10

remco_k

een cassettebandje was genoeg

Verwijderd schreef op donderdag 12 juni 2008 @ 14:37:
SELECT * FROM mypages WHERE xy > '7840_2000' AND xy < '9600_3000'
...
Sql selecteerd ook de items met coordinaten '877_240' of '788_211'
Logisch, je vergelijkt strings en geen ints, MySQL gaat dan alfabetisch de resultaten opzoeken.
Als je jouw strings op alfabetische volgorde zou zetten krijg je dit lijstje:
'7840_2000'
'788_211'
'877_240'
'9600_3000'
(en dit lijstje zou een andere volgorde hebben als je 8 losse ints op had geslagen).

De records opvragen waar xy > '7840_2000' AND xy < '9600_3000' levert dus inderdaad het resultaat op wat jij krijgt.

Maar het moge inmiddels duidelijk zijn dat je je datamodel niet goed hebt gekozen. Sla de data op in het type wat het ook daadwerkelijk is (integer dus). Dat scheelt je een hoop gedonder.

[ Voor 5% gewijzigd door remco_k op 14-06-2008 09:10 ]

Alles kan stuk.

Pagina: 1