Ezt hogyan? SQL

Figyelt kérdés

Adott 2 tábla. Posztok és helyek.


Jelenleg 2 kéréssel működik a keresés:


SELECT longitude, latitude FROM locations WHERE zipcode = 1234


Majd még 1 select


SELECT name, (

6371 *

acos(cos(radians($lat)) *

cos(radians(latitude)) *

cos(radians(longitude) -

radians($lon)) +

sin(radians($lat)) *

sin(radians(latitude)))

) AS distance FROM posts WHERE name LIKE '%asd%' HAVING distance < 15


Nem lehetne ezt a kettőt egybe fűzni, és az első selectből kiszedett latitude és longitude értékekkel folytatná a kérést?


2022. júl. 16. 17:55
1 2 3
 11/21 A kérdező kommentje:

Locations táblában van:


id, zipcode, longitude, latitude


Posts táblaban pedig szintén van longitude és latitude


(Szerintem ez egy jobb megoldás, mint hogy Irányítószámok alapján keressek a posztok között, ha egy felhasználó beállít egy 200km-es sugarat, akkor kb 4000 irányítószám lesz a requestben ami valószínűleg nem túl baráti)


Ezen felül van még

name, description meg ilyesmi.


A $lon és $lat változók az első (SELECT longitude, latitude FROM locations WHERE zipcode = 1234) kérésből vannak

2022. júl. 19. 11:18
 12/21 anonim ***** válasza:

Szerintem

"SELECT longitude, latitude FROM locations WHERE zipcode = 1234" rész sima táblaként használható lenne subselect-ként, ha az sql motor tudja.


pl:

AS distance FROM posts, (SELECT longitude, latitude FROM locations WHERE zipcode = 1234) as coord_1 WHERE..


Csak a mezőnév ütközést és a megfelelő kapcsolódást kell megoldani.

2022. júl. 19. 11:39
Hasznos számodra ez a válasz?
 13/21 anonim ***** válasza:
A 10-es válaszban leírtam már.
2022. júl. 19. 12:10
Hasznos számodra ez a válasz?
 14/21 anonim ***** válasza:
Közben valami törölve lett, szóval a 9-es válaszban van a megfejtés!
2022. júl. 19. 12:24
Hasznos számodra ez a válasz?
 15/21 A kérdező kommentje:
Rendben, köszi. Viszont nem tudom, így nem lassabb, erőforrás igényesebb mint az eredeti megoldással? Mert ez így gyakorlatilag 4 kéres, az eredeti kettő helyett
2022. júl. 19. 12:34
 16/21 anonim ***** válasza:
Nyugi, a mysql tudja mi a dolga cache tarén :)
2022. júl. 19. 12:46
Hasznos számodra ez a válasz?
 17/21 2*Sü ***** válasza:

Elvileg így kellene kinézni (nem teszteltem, a képletet sem ellenőriztem, hanem bemásoltam a tiedet):


~ ~ ~ ~ ~ ~ ~

SELECT name, 6371*

acos(cos(radians(locations.latitude))*

cos(radians(posts.latitude)) *

cos(radians(posts.longitude) -

radians(locations.longitude)) +

sin(radians(locations.latitude)) *

sin(radians(posts.latitude))) AS distance

FROM locations, posts

WHERE name LIKE '%asd%' AND zipcode=1234 AND 6371*

acos(cos(radians(locations.latitude)) *

cos(radians(posts.latitude)) *

cos(radians(posts.longitude) -

radians(locations.longitude)) +

sin(radians(locations.latitude)) *

sin(radians(posts.latitude)))<15;

~ ~ ~ ~ ~ ~ ~


HAVING-ot használva:

~ ~ ~ ~ ~ ~ ~

SELECT name, 6371*

acos(cos(radians(locations.latitude))*

cos(radians(posts.latitude)) *

cos(radians(posts.longitude) -

radians(locations.longitude)) +

sin(radians(locations.latitude)) *

sin(radians(posts.latitude))) AS distance

FROM locations, posts

WHERE name LIKE '%asd%' AND zipcode=1234

HAVING distance<15

~ ~ ~ ~ ~ ~ ~


HAVING-ot elkerülve, képletduplikáció nélkül:

~ ~ ~ ~ ~ ~ ~

SELECT * FROM

(SELECT name, 6371*

acos(cos(radians(locations.latitude))*

cos(radians(posts.latitude)) *

cos(radians(posts.longitude) -

radians(locations.longitude)) +

sin(radians(locations.latitude)) *

sin(radians(posts.latitude))) AS distance

FROM locations, posts

WHERE name LIKE '%asd%' AND zipcode=1234) tmp

WHERE distance<15

~ ~ ~ ~ ~ ~ ~


Meg lehetne talán még JOIN-nal is oldalni, de nem hiszem, hogy hatékonyabb lenne.

2022. júl. 19. 12:46
Hasznos számodra ez a válasz?
 18/21 anonim válasza:
Hogy a rossebbe ne lenne hatékonyabb egy join egy descartes szorzatnál?!?
2022. júl. 19. 12:52
Hasznos számodra ez a válasz?
 19/21 2*Sü ***** válasza:

Igen a 9. válasz is rendben van. Nem szerencsés subquery-t használni, de aligha hiszem, hogy akkora adatbázisról lenne szó, hogy ez releváns problémát okozzon. A hátránya inkább az, hogy az irányítószám, mint paraméter három helyen szerepel benne.


> [A 9. válaszra reagálva] Viszont nem tudom, így nem lassabb, erőforrás igényesebb mint az eredeti megoldással?


Nem biztos, hogy ez releváns. Illetve azért az adatbáziskezelők is szanszét optimalizálják egy-egy lekérdezés lefutását, ennyire nem értek hozzá, de elképzelhetőnek tartom, hogy az adatbáziskezelő felismeri azt, hogy a három subquery ugyanazt az rekordot adja vissza, és egyszer futtatja le. Illetve ha pát ezer soros az a locations tábla, akkor ha háromszor is futtatja le, az sem okoz hatalmas terhelést, itt azért századmásodpercekről van szó. (Feltéve persze, ha megfelelően van indexelve az adatbázis, pl. a zipcode-ra van index a locations-ban.)

2022. júl. 19. 12:54
Hasznos számodra ez a válasz?
 20/21 A kérdező kommentje:
Nagyon szuperül működik, köszi szépen :)
2022. júl. 19. 13:45
1 2 3

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!