Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa MySQL upitom

[es] :: MySQL :: Problem sa MySQL upitom

[ Pregleda: 1340 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Leruman
Srbija

Član broj: 141635
Poruke: 92
*.dynamic.sbb.rs.



+4 Profil

icon Problem sa MySQL upitom22.10.2011. u 10:33 - pre 152 meseci
Pozdrav svima, imam jedan problem sa jednim Mysql querijem. Relativno sam pocetnik u MySQL ali sam ranije radio sam MSSQL i Acessom tako da nisam potpuni pocetnik u celoj prici.

Pravim browser based RPG i iznervirao me je query koji korisitm za generisanje mapa u igrici. Jos uvek sam pocetnik tako da ce pitanje mozda biit glupo nekome, ali bih bio zhavalan ako neko moze da mi kaze zasto se querry u nastavku ne ponasa kako treba. U bazi imam tabelu sa podacima o poljima mape u kojoj treba da se desava igra. Ovo je osnovni kod za strukturu tabele iz koje povlacim podatke:

Code:

CREATE TABLE IF NOT EXISTS `maptiles` (
  `maptileid` int(10) NOT NULL AUTO_INCREMENT,
  `mapid` int(6) unsigned NOT NULL,
  `maprow` int(5) NOT NULL,
  `mapcol` int(5) NOT NULL,
  `maptile` varchar(20) NOT NULL DEFAULT 'grass1.gif',
  `passable` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`maptileid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18212 ;


U prilogu sam prikacio kompletan sql fajl koji ubacuje i podatke o samim poljima u tabelu. Mapa je dimenzija 61 x 61 polja.

Da bih mogao da prikazem podatke u obliku kvadratne forme pogodne za ekranski prikaz, kod dat u nastavku treba da iz cele tabele od 61x61 polja izvuce samo oblast 11x11 za date limite redova i kolona. On to odradi ali ne kako treba, jer se duplira broj povucenih redova. Umesto 121 redova sistem povuce 242 redova. To sam uspeo da resim preko LIMIT opcije ali me nervira zasto ne radi kako treba bez toga, Ja licno ne vidim gresku u kodu.

Code:
SELECT maprow, mapcol, maptile, passable
FROM maptiles
WHERE (
mapid =1
)
AND (
maprow >=10
AND maprow <=20
)
AND (
mapcol >=10
AND mapcol <=20
)
LIMIT 0 , 121


Bio bih zahvalan ako neko ko ima vise iskustva moze da mi kaze gde gresim. U ovom slucaju sam resio problem, ali hocu da znam gde sam pogresio.

Hvala svima unapred na bilo kakvoj pomoci.
Prikačeni fajlovi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Problem sa MySQL upitom22.10.2011. u 12:20 - pre 152 meseci
za pocetak, odlicno postavljeno pitanje :D i svi podaci potrebni da se problem reprodukuje :)

1. posle inserta ovih tvojih podataka:

Code:

mysql> select 61*61;
+-------+
| 61*61 |
+-------+
|  3721 |
+-------+
1 row in set (0.03 sec)

mysql> select count(*) from maptiles;
+----------+
| count(*) |
+----------+
|     7442 |
+----------+
1 row in set (0.00 sec)


dakle u startu - tvoj problem je to sto imas duple podatke u tabeli, zato taj upit vrati duplo podataka. Takodje, tvoje resenje za taj upit (limit) ne radi uvek!

Da bi resio problem i sprecio da se desi ponovo moras da napravis neke promene:

Code:

ysql> alter table maptiles add unique key u_position (`mapid`, `maprow`, `mapcol`);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table maptiles\G
*************************** 1. row ***************************
       Table: maptiles
Create Table: CREATE TABLE `maptiles` (
  `maptileid` int(10) NOT NULL AUTO_INCREMENT,
  `mapid` int(6) unsigned NOT NULL,
  `maprow` int(5) NOT NULL,
  `mapcol` int(5) NOT NULL,
  `maptile` varchar(20) NOT NULL DEFAULT 'grass1.gif',
  `passable` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`maptileid`),
  UNIQUE KEY `u_position` (`mapid`,`maprow`,`mapcol`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)


sa unique kljucem nad mapid, maprow i mapcol ne mozes da imas vise situaciju da ti se duplira maptile za neku mapu na nekoj poziciji ... ako sada probamo da insertujemo tvoj data:

Code:

mysql> source /tmp/x.sql;
Query OK, 1447 rows affected (0.02 sec)
Records: 1447  Duplicates: 0  Warnings: 0

Query OK, 1432 rows affected (0.02 sec)
Records: 1432  Duplicates: 0  Warnings: 0

ERROR 1062 (23000): Duplicate entry '1-1-1' for key 'u_position'
ERROR 1062 (23000): Duplicate entry '1-10-57' for key 'u_position'
ERROR 1062 (23000): Duplicate entry '1-34-25' for key 'u_position'
Query OK, 253 rows affected (0.00 sec)
Records: 253  Duplicates: 0  Warnings: 0


kao sto vidis, prso je ko zvecka, posto se nalaze dupli podaci u sql-u

kada obrisemo duplikate:
Code:

mysql> select count(*), 61*61 from maptiles;
+----------+-------+
| count(*) | 61*61 |
+----------+-------+
|     3721 |  3721 |
+----------+-------+
1 row in set (0.01 sec)


i izvrsimo tvoj upit:
Code:

mysql> SELECT maprow, mapcol, maptile, passable
    -> FROM maptiles
    -> WHERE (
    -> mapid =1
    -> )
    -> AND (
    -> maprow >=10
    -> AND maprow <=20
    -> )
    -> AND (
    -> mapcol >=10
    -> AND mapcol <=20
    -> );
+--------+--------+------------+----------+
| maprow | mapcol | maptile    | passable |
+--------+--------+------------+----------+
|     10 |     10 | grass1.gif |        1 |
...
...
|     20 |     20 | grass1.gif |        1 |
+--------+--------+------------+----------+
121 rows in set (0.00 sec)

kao sto vidis sada je ok ..

postojanje ovog kljuca inace ubrzava mnogostruko upit koji koristis.

dodatno, upit bi mogao da napises i malo citkije:

Code:

SELECT maprow, mapcol, maptile, passable
FROM maptiles
WHERE 
  mapid =1
  AND maprow BETWEEN 10 AND 20
  AND mapcol  BETWEEN 10 AND 20



Prikačeni fajlovi
 
Odgovor na temu

Leruman
Srbija

Član broj: 141635
Poruke: 92
*.dynamic.sbb.rs.



+4 Profil

icon Re: Problem sa MySQL upitom22.10.2011. u 13:34 - pre 152 meseci
Prvo hvala na brzom i detaljnom odgovoru, resili ste mi problem, mada sam ja sam bio razlog za njega :)
Podatke koje sam poslao su iz testne baze, i kada sam generesao mapu za testiranje vise puta sam pokrenuo php za unos mape u bazu i zbog toga su podaci bili duplirani.

Predlog za postavljanje polja za maprow i mapcol kao unique uzmcu u razmatranje. Kako sam trenutno zamislio bazu u okviru ove tabelo bi trebali da se nalaze podaci o poljima za vise razlicitih mapa. Zbog toga ona nisu jedinstvena i postoji polje mapID koje je jedinstveno.

Ako bih definisao da postoji samo jedna mapa gde bih sve smestin, i postavio indexe na ova dva polja, koliko bi to ubrzalo izvrsenje querija za povlacenje podataka. Igra bi trebala da bude multiplayer, pa bi svako ubrzanje znacilo ako igra ikad bude zavrsena :) A povlacenje podataka iz ove tabele bi bilo veoma cesto, sa verovatno ovih 121 redova koje trenunto jedan igrac vidi, ka god se pomeri.


Nisam znao za opciju between, da li je to specificno za MySQL, nesto se ne secam te opcije iz standardnog SQL jezika, ili mi je promakla.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Problem sa MySQL upitom22.10.2011. u 13:43 - pre 152 meseci
Citat:
Leruman
Predlog za postavljanje polja za maprow i mapcol kao unique uzmcu u razmatranje. Kako sam trenutno zamislio bazu u okviru ove tabelo bi trebali da se nalaze podaci o poljima za vise razlicitih mapa. Zbog toga ona nisu jedinstvena i postoji polje mapID koje je jedinstveno.


zato se mapid nalazi kao deo tog kljuca tako da mozes da imas za mapid=1 polje 10,10 i za mapid=2 isto polje 10,10. Da je samo jedna mapa u tabeli onda mapid ne bi bio deo tog kljuca


Citat:
Leruman:
Nisam znao za opciju between, da li je to specificno za MySQL, nesto se ne secam te opcije iz standardnog SQL jezika, ili mi je promakla.


mrzi me sad da jurim gde mi je dokument sa standardom da proverim dal je "standardna" ali imas je u ORACLE-u, DB2 .. tako da pretpostavljam da jeste u standardu
 
Odgovor na temu

Leruman
Srbija

Član broj: 141635
Poruke: 92
*.dynamic.sbb.rs.



+4 Profil

icon Re: Problem sa MySQL upitom22.10.2011. u 16:37 - pre 152 meseci
Hvlaa na odgovoru okokluceva, nisam toliko detaljno ulazio u podesavanja MYSQL.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Problem sa MySQL upitom22.10.2011. u 19:04 - pre 152 meseci
Citat:
Leruman: podesavanja MYSQL.


to nema nikakve veze sa mysql-om, to je standardna stvar u relacionim bazama podataka od kada iste postoje
 
Odgovor na temu

[es] :: MySQL :: Problem sa MySQL upitom

[ Pregleda: 1340 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.