Temat: Problem. Jak napisać zapytanie?

Witam
mam dwie bazy danych:
1. z adresami firm, w tym oddzielna tabela Ulica. Ludzie wpisują tę ulicę różnie (małymi literami, tylko same nazwisko - np. Popiełuszki itp.)
2. z dzielnicami miasta, w tym oddzielna tabela Ulica (pełne nazwy ulic, np. ks. Jerzego Popiełuszki)

I teraz chcę wyciągnąć wszystkie firmy z dzielnicy A.
jak to zrobić?
Próbowałem tak:


SELECT *
FROM osiedla AS os
LEFT JOIN
(SELECT firmy.firma_ulica AS ul, firmy.* FROM firmy) AS sk
ON (sk.ul like os.ulica)
WHERE os.osiedle_id='1' AND sk.ul!=''
ORDER BY sk.firmy_data DESC


Problem w tym, że nie pokazuje wszystkich firm.
Jak można to napisać inaczej?

pozdr.
w.Wojtek Kibitlewski edytował(a) ten post dnia 15.08.09 o godzinie 00:19
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Problem. Jak napisać zapytanie?

Jaka baza danych?

Problem może tkwić w tym, że LIKE stosuje się zwykle razem z tzw. wildcards. Spróbuj dodać je do warunku (sk.ul like os.ulica).
Możesz użyć też funkcji SOUNDEX.

Temat: Problem. Jak napisać zapytanie?

dzięki..
niestety, przy zastosowaniu wildcards powstaje błąd zapytania..
ON (%sk.ul like os.ulica) 

lub zero wyników
ON ('%sk.ul%' like os.ulica) 


Natomiast przy SOUNDEX pojawiają sie bzdury, np. dla ulicy "Żabia" przypasowywana jest ulica "Lipowa".. Jak sobie poczytałem SOUNDEX słabo się sprawdza dla polskich wyrazów..

ps. baza mysql
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Problem. Jak napisać zapytanie?

Wojtek Kibitlewski:
dzięki..
niestety, przy zastosowaniu wildcards powstaje błąd zapytania..
ON (%sk.ul like os.ulica) 

Tak nie można.
Prędzej:


SELECT *
FROM osiedla AS os,
(SELECT firmy.firma_ulica AS ul, firmy.* FROM firmy) AS sk
WHERE os.osiedle_id='1' AND sk.ul!=''
AND (sk.ul IS NULL OR os.ulica like '%' || sk.ul)
ORDER BY sk.firmy_data DESC


ale nie wiem czy można tak w mysql'u robić z like'em.
Łatwiej będzie jak wkleisz skrypty z CREATE TABLE
i przykładowymi danymi.Irek Słonina edytował(a) ten post dnia 15.08.09 o godzinie 11:18

Temat: Problem. Jak napisać zapytanie?

nie możesz pominąć warunku ON(...) błąd składni

Natomiast rozwiązanie okazało się stosunkowo proste..

SELECT * 
FROM osiedla AS os
LEFT JOIN
(SELECT firmy.firma_ulica AS ul, firmy.* FROM firmy) AS sk
ON (os.ulica RLIKE sk.ul)
WHERE os.osiedle_id='1' AND sk.ul!=''
ORDER BY sk.firmy_data DESC


dopasowuje bez zarzutów.. przynajmniej narazie..

konto usunięte

Temat: Problem. Jak napisać zapytanie?

Pewnie jeszcze bedziesz mial problemy.
Najlepiej zrobic to porzez tabele posrednia(tymczasowa)
Wybrac wszystkie firmy z ulica bez zadnych specialnych znakow.
spacji, " ul. " , "ul " "aleja czy nuli .
czyli zrobic poprawny slownik z ulicami firm // zromalizowac dane
Zamienic wszystko na male litery lub duze funkcja upper lub lower.
Nule mozna zamienic NVL lub NVL2.
Natomiast ul. itp. mozna poprzez fukjcie like %ul% gdzie wybierzesz te ktore maja to slowo a potem funkcja DECODE albo CAST jak sie niemyle
ktora ucina Varchar to okreslonej liczy znakow od lewej.
Wszystko to UNION (czyli zlaczyc)i masz poprawny slownik firm i ulic a potem laczysz ja z tabelka dzielnica.

Jesli mozesz tworzyc obiekty w tej bazie to najlepiej zrobic
nazwe ulicy bez slowa ul., numer budynku, numer mieszkania.
I zalozyc CHECK ktory bedzie sprawdzal poprawosc wpisywanych do bazy danych.

Niezapomnij uzyc distincta zeby dane sie nie dublowaly albo UNION
ktora sama automatycznie uzywa tej funkcji
NIe wiem jaki jest rozmiar bazy, ale przy dlugich obliczeniach uzyj
hash`a policzy sie migiem.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Problem. Jak napisać zapytanie?

Radosław Karbarz:
Natomiast ul. itp. mozna poprzez fukjcie like %ul% gdzie wybierzesz te ktore maja to slowo

Good luck :)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Problem. Jak napisać zapytanie?

Wojtek Kibitlewski:
dzięki..
niestety, przy zastosowaniu wildcards powstaje błąd zapytania..
ON (%sk.ul like os.ulica) 

lub zero wyników
ON ('%sk.ul%' like os.ulica) 

Bo wildcards sie nie uzywa bezposrednio z nazwami kolumn. W pierszym przypadku baza szuka tabeli o nazwie %sk a w drugim doslownego ciagu znakow %sk.ul% (nie traktuje tego jako nazwy tabeli/kolumny)
Natomiast rozwiązanie okazało się stosunkowo proste..

SELECT * 
FROM osiedla AS os
LEFT JOIN
(SELECT firmy.firma_ulica AS ul, firmy.* FROM firmy) AS sk
ON (os.ulica RLIKE sk.ul)
WHERE os.osiedle_id='1' AND sk.ul!=''
ORDER BY sk.firmy_data DESC


To RLIKE w tym przypadku dziala inaczej niz LIKE? Specyficzne zlaczenie przez LIKE/RLIKE, ale skoro zwraca wynik jakiego oczekujesz.. :)Bartosz Ślepowronski edytował(a) ten post dnia 17.08.09 o godzinie 17:37

Temat: Problem. Jak napisać zapytanie?

Bartosz Ślepowronski:
To RLIKE w tym przypadku dziala inaczej niz LIKE? Specyficzne zlaczenie przez LIKE/RLIKE, ale skoro zwraca wynik jakiego oczekujesz..

RLike to nic innego jak zastąpienie wildcards.. i sprawdza się..

dziękuję wszystkim za sugestie..

pozdr.
w.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Problem. Jak napisać zapytanie?

Precyzujac - RLIKE nie tyle zastepuje wildcards ile rozszerza ich liste (o te: ^$[[:<:]][[:>:]]|), ale faktycznie przy okazji automatycznie "dodaje" % po obu stronach stringa. Zapomnialem :)

konto usunięte

Temat: Problem. Jak napisać zapytanie?

Bartosz Ślepowronski:
Radosław Karbarz:
Natomiast ul. itp. mozna poprzez fukjcie like %ul% gdzie wybierzesz te ktore maja to slowo

Good luck :)

pomylilo mi sie

upper(...) not like '%UL.%

Następna dyskusja:

Wyzwalacz - jak go napisać ?




Wyślij zaproszenie do