Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] SELECT i WHERE - czemu nie działa ?
Forum PHP.pl > Forum > Bazy danych > MySQL
mambus
Witam.

Mam pewien problem, otóż nie rozumiem, dlaczego nie działa mi poniższe zapytanie w tej postaci - tzn. zwraca pusty wynik.
Natomiast, kiedy zastąpię SELECTy z WHEREa liczbą - wszystko jest okej i dane się wyciągają.

Oto zapytanie:
  1. SELECT DISTINCT(`direction`) AS `direction` FROM `i_lines_detail_default` WHERE `order`>'(SELECT `order` FROM `i_lines_detail_default` WHERE `line_id`=1 AND `station_id`=1 )' AND `order`<'(SELECT `order` FROM `i_lines_detail_default` WHERE `line_id`=1 AND `station_id`=2 )'


A oto zawartość i struktura tabelki:

  1. CREATE TABLE IF NOT EXISTS `i_lines_detail_default` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `line_id` int(11) NOT NULL,
  4. `station_id` int(11) NOT NULL,
  5. `ttns` int(11) NOT NULL,
  6. `direction` enum('T','R') NOT NULL,
  7. `is_start` enum('0','1') NOT NULL COMMENT 'czy przystanek jest początkowym',
  8. `is_stop` enum('0','1') NOT NULL COMMENT 'czy przystanek jest końcowym',
  9. `order` int(11) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=17 ;
  12.  
  13. --
  14. -- Zrzut danych tabeli `i_lines_detail_default`
  15. --
  16.  
  17. INSERT INTO `i_lines_detail_default` (`id`, `line_id`, `station_id`, `ttns`, `direction`, `is_start`, `is_stop`, `order`) VALUES
  18. (1, 1, 1, 2, 'T', '1', '0', 1),
  19. (2, 1, 2, 0, 'T', '0', '1', 4),
  20. (3, 1, 1, 2, 'R', '0', '1', 4),
  21. (4, 1, 2, 0, 'R', '1', '0', 1),
  22. (5, 1, 3, 0, 'T', '0', '0', 2),
  23. (6, 1, 4, 0, 'T', '0', '0', 3),
  24. (7, 1, 4, 0, 'R', '0', '0', 2),
  25. (8, 1, 3, 0, 'R', '0', '0', 3),
  26. (9, 2, 5, 4, 'T', '1', '0', 1),
  27. (10, 2, 6, 3, 'T', '0', '0', 2),
  28. (11, 2, 7, 8, 'T', '0', '0', 3),
  29. (12, 2, 8, 6, 'T', '0', '0', 4),
  30. (13, 2, 9, 12, 'T', '0', '0', 5),
  31. (14, 2, 4, 12, 'T', '0', '0', 6),
  32. (15, 2, 10, 10, 'T', '0', '0', 7),
  33. (16, 2, 11, 0, 'T', '0', '1', 8);



Bardzo proszę o pomoc... jeśli źle skonstruowałem zapytanie, to jakąś ewentualną podpowiedź, jak inaczej mógłbym to zrobić...
mar1aczi
Zerknij, co oznacza pojedynczy cudzysłów smile.gif
Co chcesz uzyskać - jaki wynik?
Damonsson
1. ' ' - oznacza, że szuka dokładnie takiego tekstu jaki w nim jest zawarty.
2. Podzapytania zwracają Ci 2 wartości (1 i 4 oraz 4 i 1 akurat tu), więc i tak miałbyś błędne zapytanie.
mambus
Cytat(mar1aczi @ 17.09.2013, 11:07:03 ) *
Zerknij, co oznacza pojedynczy cudzysłów smile.gif
Co chcesz uzyskać - jaki wynik?



W kodzie wygląda to tak, że mam funkcję z 3 argumentami - przystanek startowy, przystanek docelowy oraz id linii.
Teraz muszę określić, w jakim kierunku porusza się pojazd - kierunku T bądź R.

I teraz, chciałbym wyciągnąć `direction` czyli ten kierunek, where id linii oraz kolejność (order) przystanku startowego jest mniejsza od kolejności (order) przystanku końcowego.

Mam nadzieję, że nie pogmatwałem zbytnio... smile.gif
mmmmmmm
1. Zapytanie nie powinieneś mieć w '. Jeśli tak masz, to SQL traktuje to jako teskt, a nie polecenie do wykonania.
2. Nawet gdybyś nie miał w apostrofach, to nadal masz błąd, bo porównujesz za pomocą operatora < liczbę ze zbiorem.
SELECT `order` FROM `i_lines_detail_default` WHERE `line_id`=1 AND `station_id`=1
zwraca dwa rekordy (id=1 i id=3), więc będzie wyj..ka
3. Zapytanie strasznie przekombinowane. 3 razy odwołujesz się do tej samej tabeli... Na pewno można to zrobic dużo prościej.
mambus
Cytat(mmmmmmm @ 17.09.2013, 12:13:13 ) *
3. Zapytanie strasznie przekombinowane. 3 razy odwołujesz się do tej samej tabeli... Na pewno można to zrobic dużo prościej.



Zapewne masz rację, możesz mi coś podpowiedzieć? Nie jestem niestety masterem w MySQLu jak widać smile.gif
Domyślam się, że podzapytania w zapytaniach, nie są zbyt wydajne...
mmmmmmm
teraz nie mam czasu. Może wieczorem. Może kto inny.

  1. SELECT i1.direction FROM i_lines_detail_default i1 JOIN i_lines_detail_default i2
  2. ON i1.line_id=i2.line_id
  3. AND i2.order>i1.ORDER
  4. AND i2.line_id=2 /* podana linia*/
  5. AND i2.station_id=4 /* podany przystanek koncowy*/
  6. WHERE i1.station_id=8 /* podany przystanek poczatkowy */
mambus
Cytat(mmmmmmm @ 17.09.2013, 23:46:27 ) *
teraz nie mam czasu. Może wieczorem. Może kto inny.

  1. SELECT i1.direction FROM i_lines_detail_default i1 JOIN i_lines_detail_default i2
  2. ON i1.line_id=i2.line_id
  3. AND i2.order>i1.ORDER
  4. AND i2.line_id=2 /* podana linia*/
  5. AND i2.station_id=4 /* podany przystanek koncowy*/
  6. WHERE i1.station_id=8 /* podany przystanek poczatkowy */



@mmmmmmm , bardzo Ci dziękuję za pomoc. Pomogło - rozumiem już, jak można to było zrobić optymalniej, dzięki jeszcze raz i klikam pomógł 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.