Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Problem z JOIN .. JOIN .. ON .. ON ..
Forum PHP.pl > Forum > Bazy danych
peksiarz
witajcie, mam problem tego typu:
  1. SELECT pk1.id_przystanku1, pk2.id_przystanku2
  2. FROM przystanek_kursu pk1 JOIN przystanek_kursu pk2
  3. ON pk1.id_kursu = pk2.id_kursu, przystanek p, kursy k
  4. WHERE p.id_przystanku = pk1.id_przystanku AND p.id_przystanku = pk2.id_przystanku AND k.id_kursu = pk1.id_kursu AND pk1.id_przystanku = '$pocz' AND pk2.id_przystanku = '$kon' AND pk1.numer < pk2.numer

po wklepaniu powyższego zapytania do wiersza poleceń otrzymuje za każdym razem:


#1064 - Something is wrong in your syntax obok 'ON pk1.id_kursu = pk2.id_kursu, przystanek p, kursy k
' w linii 3

tabele wyglądają tak:

[przystanek]
id_przystanku, nazwa_przystanku

[przystanek_kursu]
id_pk, numer, id_kursu, id_przystanku

[kursy]
id_kursu, nazwa_kursu

W czym jest błąd, wie ktos może ?
dr_bonzo
usun "przystanek p, kursy k" z JOINa i wrzuc do FROM, ew. do kolejnego JOINA z ON p.id_przystanku = pk1.id_przystanku itd.
peksiarz
zrobiłem jak kazałeś, znaczy się "przystanek p, kursy k" wrzuciłem do froma lecz nadal pokazuje ten sam błąd

Zapytanie wygląda teraz tak:
  1. SELECT pk1.id_przystanku, pk2.id_przystanku
  2. FROM przystanek p, kursy k, przystanek_kursu pk1 JOIN przystanek_kursu pk2
  3. ON pk1.id_kursu = pk2.id_kursu
  4. WHERE p.id_przystanku = pk1.id_przystanku AND p.id_przystanku = pk2.id_przystanku AND k.id_kursu = pk1.id_kursu AND pk1.id_przystanku = '$pocz' AND pk2.id_przystanku = '$kon' AND pk1.numer < pk2.numer

no i nie wiem co może być nie tak.. sprawdzałem dokładnie czy nie ma literówek a błąd wciąż się wyswietla worriedsmiley.gif
Jak miałby wyglądac kolejny JOIN ..ON .. ?
JaRoPHP
Aliasów kolumn (a tych używasz), nie można używać w warunku WHERE (musi być użyta oryginalna nazwa).

Więc zapytanie poniższe nie jest poprawne:
  1. SELECT *
  2. FROM przystanek p
  3. WHERE p.id_przystanku = '111'

Natomiaste te jest poprawne:
  1. SELECT *
  2. FROM przystanek p
  3. WHERE przystanek.id_przystanku = '111'
Raynold
Można używać aliasów w zapytaniu WHERE - przetestowane.

Problemem jest raczej to, że jeśli używasz JOIN, to musisz wszystkie tabele połączyć JOINami. Nie możesz mieć n tabel połączonych w jedną i kolejne [m] luźno. To, co napisałem jest na 95% pewne, nie testowane, ale z tego, co do tej pory pracowałem z SQLem, powinno być poprawne.

Poza tym na korzyść tego rozwiązania świadczy to, że potem i tak dorzucasz warunki typu "p.id_przystanku = pk2.id_przystanku" etc. - to powinno znaleźć się w JOIN, w warunku ON p.id_przystanku = pk2.id_przystanku. Jeśli robisz porównanie między wartościami pewnych kolumn między dwiema tabelami, to przecież to jest warunek połączenia tychże tabel. Dlatego część warunków z WHERE powinieneś wrzucić jako JOIN... ON... do fragmentu FROM.

Jeszcze jedna rzecz: w takim wypadku próbujesz połączyć 3 tabele 3 warunkami. A wiadomo, że n tabel łączy się n-1 warunkami. Chodzi o tabele pk1, pk2 i p. Musisz się zdecydować - tabelę p łączysz z pk1 albo z pk2.

Wydaje mi się, że może chodzić o coś takiego:

  1. SELECT pk1.id_przystanku, pk2.id_przystanku
  2. FROM przystanek p JOIN kursy k JOIN przystanek_kursu pk1 JOIN przystanek_kursu pk2
  3. ON pk1.id_kursu = pk2.id_kursu
  4. ON k.id_kursu = pk1.id_kursu
  5. ON p.id_przystanku = pk1.id_przystanku
  6. WHERE pk1.id_przystanku = '$pocz' AND pk2.id_przystanku = '$kon' AND pk1.numer < pk2.numer


Oczywiście, lepiej by było, gdybyś zarzucił tutaj jakimś dokładniejszym opisem tabel (jakiś schemat w formie graficznej mile widziany) oraz dokładnym wyjaśnieniem, co chcesz wyciągnąć, bo to, co napisałeś jest dość... hmmm... mało czytelne.

Pozdrawiam
peksiarz
jeśli by komuś sie chciało dociekać rozwiązania to zapraszam, poniżej umieściłem export tabel wraz z przykładowymi danymi:
Kod
-- phpMyAdmin SQL Dump
-- version 2.6.0-pl2
-- [url=http://www.phpmyadmin.net]http://www.phpmyadmin.net[/url]
--
-- Host: localhost
-- Czas wygenerowania: 11 Lut 2007, 22:33
-- Wersja serwera: 3.23.58
-- Wersja php: 5.0.2
--
-- Baza danych: `komunikacja`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `kursy`
--

CREATE TABLE `kursy` (
  `id_kursu` int(11) NOT NULL auto_increment,
  `nazwa_kursu` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id_kursu`)
) TYPE=MyISAM AUTO_INCREMENT=1234625;

--
-- Zrzut danych tabeli `kursy`
--

INSERT INTO `kursy` VALUES (2049, 'Wodzisław Śl, Jastrzębie Zd., Żory, Mikołów, Katowice');


-- --------------------------------------------------------

--
-- Struktura tabeli dla  `przystanek`
--

CREATE TABLE `przystanek` (
  `id_przystanku` int(10) unsigned NOT NULL auto_increment,
  `id_miasta` int(11) NOT NULL default '0',
  `nazwa_przystanku` varchar(100) NOT NULL default '',
  `czy_glowny` enum('nie','tak') NOT NULL default 'nie',
  PRIMARY KEY  (`id_przystanku`),
  KEY `id_miasta` (`id_miasta`)
) TYPE=MyISAM AUTO_INCREMENT=64;

--
-- Zrzut danych tabeli `przystanek`
--

INSERT INTO `przystanek` VALUES (1, 1, 'Wodzisław Śl. D.A.', 'tak');
INSERT INTO `przystanek` VALUES (2, 1, 'Wilchwy, Cyganek', 'nie');
INSERT INTO `przystanek` VALUES (58, 8, 'Granica Żab', 'tak');
INSERT INTO `przystanek` VALUES (5, 1, 'Wilchwy, Szkoła', 'nie');
INSERT INTO `przystanek` VALUES (6, 1, 'Wilchwy, Blazy', 'nie');
INSERT INTO `przystanek` VALUES (7, 2, 'Mszana, ul Wodz.', 'nie');
INSERT INTO `przystanek` VALUES (8, 2, 'Mszana, szkołą.', 'nie');
INSERT INTO `przystanek` VALUES (9, 2, 'Mszana, skrz.', 'nie');
INSERT INTO `przystanek` VALUES (10, 3, 'Jastrzębie, Góra Wyzwol.', 'nie');
INSERT INTO `przystanek` VALUES (11, 3, 'Jastrzębie Dolne', 'nie');
INSERT INTO `przystanek` VALUES (12, 3, 'Jastrzębie, liceum', 'nie');
INSERT INTO `przystanek` VALUES (13, 3, 'Jastrzębie, os.III', 'nie');
INSERT INTO `przystanek` VALUES (14, 3, 'Jastrzębie, A.Bożka', 'tak');
INSERT INTO `przystanek` VALUES (15, 3, 'Jastrzębie, D.A.', 'tak');
INSERT INTO `przystanek` VALUES (16, 3, 'Jastrzębie, os.IV', 'nie');
INSERT INTO `przystanek` VALUES (17, 3, 'Zofiówka, skrz.', 'nie');
INSERT INTO `przystanek` VALUES (18, 3, 'Bzie, skrz.', 'nie');
INSERT INTO `przystanek` VALUES (19, 3, 'Pniówek skrz.', 'nie');
INSERT INTO `przystanek` VALUES (20, 6, 'Pawłowice III', 'nie');
INSERT INTO `przystanek` VALUES (21, 6, 'Pawłowice UG', 'tak');
INSERT INTO `przystanek` VALUES (22, 6, 'Pawłowice III', 'nie');
INSERT INTO `przystanek` VALUES (23, 6, 'Pawłowice UG', 'tak');
INSERT INTO `przystanek` VALUES (24, 6, 'Warszowice, skrz.', 'nie');
INSERT INTO `przystanek` VALUES (25, 7, 'Żory, pomnik', 'nie');
INSERT INTO `przystanek` VALUES (26, 7, 'Żory, centrum', 'tak');
INSERT INTO `przystanek` VALUES (27, 7, 'Woszczyce', 'nie');
INSERT INTO `przystanek` VALUES (28, 7, 'Gardawice', 'nie');
INSERT INTO `przystanek` VALUES (29, 7, 'Zawiść, skrz', 'nie');
INSERT INTO `przystanek` VALUES (30, 8, 'Łaziska Górne', 'tak');
INSERT INTO `przystanek` VALUES (31, 9, 'Mikołów, D.K.', 'tak');
INSERT INTO `przystanek` VALUES (32, 10, 'Katowice, Piotrowice', 'nie');
INSERT INTO `przystanek` VALUES (33, 10, 'Katowice, ul. Mikołowska', 'nie');
INSERT INTO `przystanek` VALUES (34, 10, 'Katowice D.K.', 'nie');
INSERT INTO `przystanek` VALUES (35, 10, 'Katowice, D.A.', 'tak');

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `przystanek_kursu`
--

CREATE TABLE `przystanek_kursu` (
  `id_pk` int(10) unsigned NOT NULL auto_increment,
  `numer` int(10) unsigned NOT NULL default '0',
  `czy_ostatni` enum('nie','tak') NOT NULL default 'nie',
  `id_kursu` int(11) NOT NULL default '0',
  `id_przystanku` int(11) NOT NULL default '0',
  `godz` time NOT NULL default '00:00:00',
  `km` decimal(4,1) NOT NULL default '0.0',
  `stanowisko` int(5) default NULL,
  PRIMARY KEY  (`id_pk`),
  KEY `id_kursu` (`id_kursu`,`id_przystanku`)
) TYPE=MyISAM AUTO_INCREMENT=117;

--
-- Zrzut danych tabeli `przystanek_kursu`
--

INSERT INTO `przystanek_kursu` VALUES (1, 1, 'nie', 2049, 1, '14:15:00', 0.0, 2);
INSERT INTO `przystanek_kursu` VALUES (2, 2, 'nie', 2049, 2, '14:18:00', 2.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (3, 3, 'nie', 2049, 5, '14:20:00', 3.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (4, 4, 'nie', 2049, 6, '14:22:00', 4.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (5, 5, 'nie', 2049, 7, '14:24:00', 5.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (6, 6, 'nie', 2049, 8, '14:25:00', 6.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (7, 7, 'nie', 2049, 9, '14:28:00', 8.0, 26);
INSERT INTO `przystanek_kursu` VALUES (8, 8, 'nie', 2049, 10, '14:30:00', 9.0, 15);
INSERT INTO `przystanek_kursu` VALUES (9, 9, 'nie', 2049, 11, '14:32:00', 10.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (10, 10, 'nie', 2049, 12, '14:34:00', 11.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (11, 11, 'nie', 2049, 13, '14:36:00', 12.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (12, 12, 'nie', 2049, 14, '14:39:00', 14.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (13, 13, 'nie', 2049, 15, '14:42:00', 15.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (14, 14, 'nie', 2049, 16, '14:46:00', 17.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (15, 15, 'nie', 2049, 19, '14:55:00', 23.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (16, 16, 'nie', 2049, 20, '14:57:00', 24.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (17, 17, 'nie', 2049, 21, '14:59:00', 25.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (18, 18, 'nie', 2049, 24, '15:04:00', 29.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (19, 19, 'nie', 2049, 25, '15:10:00', 34.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (20, 20, 'nie', 2049, 26, '15:13:00', 36.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (21, 21, 'nie', 2049, 27, '15:23:00', 43.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (22, 22, 'nie', 2049, 28, '15:27:00', 47.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (23, 23, 'nie', 2049, 29, '15:29:00', 49.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (24, 24, 'nie', 2049, 31, '15:42:00', 59.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (25, 25, 'nie', 2049, 32, '15:50:00', 67.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (26, 26, 'nie', 2049, 33, '15:58:00', 72.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (27, 27, 'nie', 2049, 34, '16:00:00', 73.0, NULL);
INSERT INTO `przystanek_kursu` VALUES (28, 28, 'tak', 2049, 35, '16:03:00', 74.0, NULL);

  1. SELECT pk1.id_przystanku, pk2.id_przystanku
  2. FROM przystanek p JOIN kursy k JOIN przystanek_kursu pk1 JOIN przystanek_kursu pk2
  3. ON pk1.id_kursu = pk2.id_kursu
  4. ON k.id_kursu = pk1.id_kursu
  5. ON p.id_przystanku = pk1.id_przystanku
  6. WHERE pk1.id_przystanku = '$pocz' AND pk2.id_przystanku = '$kon' AND pk1.numer < pk2.numer

powyższe zapytanie zaproponowane przez ~Raynold'a testowałem no ale niestety wywalało mi podobny błąd:
Kod
#1064 - Something is wrong in your syntax obok 'ON pk1.id_kursu = pk2.id_kursu
              ON k.id_kursu = pk' w linii 3

to jest najtrudniejsze zapytanie które kiedykolwiek próbowałem stworzyć smile.gif
SongoQ
@JaRoPHP Glupoty piszesz.

@peksiarz
Jesli dajesz JOIN to pozniej musis byc ON warunek lub warunki zlaczenia jesli nie dajesz [typ zlaczenia] JOIN to warunki sa w WHERE
peksiarz
~SongoQ wrzuciłem wszystkie warunki do kolejnych ON
  1. SELECT pk1.id_przystanku, pk2.id_przystanku
  2. FROM przystanek p JOIN kursy k JOIN przystanek_kursu pk1 JOIN przystanek_kursu pk2
  3. ON pk1.id_kursu = pk2.id_kursu
  4. ON k.id_kursu = pk1.id_kursu
  5. ON p.id_przystanku = pk1.id_przystanku
  6. ON pk1.id_przystanku = '$pocz'
  7. ON pk2.id_przystanku = '$kon'
  8. ON pk1.numer < pk2.numer

ale w phpMyAdminie wywala mi błąd:
#1064 - Something is wrong in your syntax obok 'ON pk1.id_kursu = pk2.id_kursu
ON k.id_kursu = pk' w linii 3


Co jest nie tak z JOIN'em? Dla zainteresowanych tematem w poprzednim poście umieściełem export z mojej bazy wraz z przykładowymi danymi
nospor
http://dev.mysql.com/doc/refman/5.0/en/join.html
Przejrzyj dokladnie skladnie joina, przejrzyj dolaczone przyklady i porownaj sobie z tym co masz.

Cytat
Dla zainteresowanych tematem w poprzednim poście umieściełem export z mojej bazy wraz z przykładowymi danymi
No bajer, popraw tylko tego posta o bbcode
peksiarz
Udało się exclamation.gif!
  1. SELECT k.id_kursu, k.nazwa_kursu, pk1.id_przystanku, pk1.godz, pk1.stanowisko, pk2.id_przystanku, pk2.godz, pk1.km, pk2.km
  2. FROM kursy k
  3. LEFT JOIN przystanek_kursu pk1 ON pk1.id_przystanku ='$p' AND k.id_kursu = pk1.id_kursu
  4. LEFT JOIN przystanek_kursu pk2 ON pk2.id_przystanku ='$k' AND k.id_kursu = pk2.id_kursu
  5. WHERE pk1.numer < pk2.numer


Dzięki wszystkim za pomoc i motywacje smile.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.