Piccolo
22.09.2004, 12:27:30
Mam zrobioną wyszukiwarkę numerów i przy poniższym kodzie wyszukiwanie trwa kilkadziesiąt sekund na dysku lokalnym. Próbowałem korzystać z LEFT JOIN, ale nie wychodziło mi z trzema tabelami, na dwóch chulało, a przy jakiejkolwiek próbie dodania trzeciej tabeli do SELECT-a wywalało błąd.
Oto kod SELECT-a:
("SELECT vehicle.*, tabele2.NR_TAB, tabele2.NT, data.NR_RYS, data.OPIS, data.NR_KOD
FROM vehicle, tabele2, data
WHERE data.NR_RYS LIKE '%$search%' AND tabele2.NR_KOD = data.NR_KOD AND data.MOD = vehicle.MOD
ORDER BY data.NR_RYS, tabele2.NR_TAB, vehicle.MOD ASC");
Proszę o pomoc, bo nie wiem jak z tego wybrnąć. Nie jestem jeszcze zaawansowany w programowaniu. Przeszukałem zasoby forum i nie znalazłem nic ciekawego.
toszcze
22.09.2004, 12:48:20
Byloby latwiej gdybys podal strukture tabel...
Domyslam sie, ze moze pomoc zalozenie indeksu (indeksow) na pola MOD i NR_KOD we wszystkich tabelach, ktore sa za pomoca tych pol w jakis sposob powiazane. Ale jak mowie - struktura tabel moglaby troche pomoc w optymalizacji.
Piccolo
22.09.2004, 14:05:45
Oto struktura tabel:
# Struktura tabeli dla `data`
#
CREATE TABLE data (
ID double NOT NULL default '0',
NR_RYS varchar(15) default NULL,
OPIS varchar(100) default NULL,
NR_POS varchar(5) default NULL,
QUANT varchar(5) default NULL,
NR_KOD varchar(5) default NULL,
ZM varchar(255) default NULL,
ZAST varchar(255) default NULL,
MOD varchar(5) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
# --------------------------------------------------------
#
# Struktura tabeli dla `tabele2`
#
CREATE TABLE tabele2 (
ID double NOT NULL default '0',
KOD_GR double default NULL,
NR_TAB varchar(10) default NULL,
NR_KOD varchar(5) default NULL,
NT varchar(80) default NULL,
IMG varchar(10) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
# --------------------------------------------------------
#
# Struktura tabeli dla `vehicle`
#
CREATE TABLE vehicle (
ID double NOT NULL default '0',
M varchar(5) default NULL,
MODEL varchar(80) default NULL,
MOD varchar(5) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;
DeyV
22.09.2004, 14:37:21
prosiłbym jeszcze o jakiś plik z przykładowymi danymi, inaczej trudno się wypowiadać na temat normalizacji tej tabeli. (najlepiej w postaci załącznika, tj. tylko linku do pliku)
A co do pytania opartego o składnie JOIN - oto prost przykład tego zapytania:
SELECT
vehicle.*,
tabele2.NR_TAB,
tabele2.NT,
DATA.NR_RYS,
DATA.OPIS,
DATA.NR_KOD
FROM DATA LEFT JOIN tabele2 ON ( tabele2.NR_KOD = DATA.NR_KOD )
LEFT JOIN vehicle ON ( DATA.MOD = vehicle.MOD )
WHERE DATA.NR_RYS LIKE '%test%'
ORDER BY DATA.NR_RYS, tabele2.NR_TAB, vehicle.MOD ASC
toszcze
22.09.2004, 16:12:33
Pierwsza rzecz, ktora rzucila mi sie w oczy - zmien typ pola ID (w kazdej z tabel) na INT. Uzycie DOUBLE jest tam zbedne - przeciez wartosci pola ID beda zawsze liczbami calkowitymi.
Po drugie - podtrzymuje swoja wypowiedz o koniecznosci zalozenia odpowiednich indeksow (wymienilem je w poprzednim poscie). Oczywiscie nie znam wszystkich relacji pomiedzy tabelami, wiec mozliwe, ze indeksy powinny rowniez zawierac inne pola, ale na potrzeby tego zapytania powinno to wystarczyc.
Piccolo
23.09.2004, 06:07:29
Dzięki DeyV, jesteś wielki, właśnie o coś takiego mi chodziło. Powiem Ci szczerze, że próbowałem na podobnej zasadzie, ale nie wiem dlaczego mi nie wychodziło. Chyba zadziałała zasada, że jak zrobi coś początkujący to nie działa, a zrobi to samo fachowiec - rusza od strzału.

Mój kod na pierwszy rzut oka zyglądał identycznie, a jednak wywalał błąd.
Toszcze, relacje są jak najbardziej prawidłowe, ale dzięki za zainteresowanie i zwrócenie uwagi na ID, już zmieniam.
DeyV
23.09.2004, 10:47:44
Poza niezbędnymi indexami (wszystkie złączenia powinny być robione przy pomocy kolumn z indexami) warto by było doprowadzić do stanu, gdy można łączyć tabele tylko przy pomocy kolumn typu INT.
Tym bardziej że ich nazwy niejako same narzucają taki typ.
W przypadku gdy nie jest to możliwe - lepiej nawet zastosować klucz (sztuczny?? - jak to się nazywało...) aby uniknąć korzystania z varchar w takich przypadkach.
Piccolo
23.09.2004, 13:08:32
NR_KOD i MOD to kolumny, które zawierają oznaczenia narzucone mi przez bazę, którą otrzymałem w spadku po Accessowej bazie. Moim zadaniem było takie dopasowanie bazy internetowej, aby po jakiejkolwiek zmianie w Accessie można było bez problemu przekonwertować na "internet". Tabela "dane" zawiera 70 tys. rekordów, tabela tabele2 zawiera 4000 rekordów, a tabela "vehicle" tylko 20 rekordów. Wmieniać te wszystkie pola w tych trzech tabelach , przy założeniu, że się powtarzają i składaja się z liter i cyfr, to dla mnie trochę za dużo, a inna sprawa, że musiałbym to robić po każdej aktualizacji Accessa. Chyba zgodzisz się, że lepiej zrobić to na "varchar".
Pozdrowionka i dzięki DeyV
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.