Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql_query i podkwerenda - składnia
Forum PHP.pl > Forum > Przedszkole
talkenberg
Witam.

W kodzie php mam coś takiego
  1. $oferta = mysql_query('SELECT * FROM takepass WHERE (from_date IN (SELECT dni FROM zakres)) OR (to_date IN (SELECT dni FROM zakres))');


Przy próbie listingu rekordów otrzymuję błąd że dostarczony argument (w pętli while) nie jest właściwy.

Jeśli usunę drugi warunek z OR, to wszystko działa. Czy zrobiłem jakiś błąd składniowy? Po wpisaniu tego zapytania do phpMyAdmina dostaję zestaw rekordów.
Dzięki za pomoc
nospor
Tu masz napisane co się w takim przypadku robi
Temat: Jak poprawnie zada pytanie
zastosuj się do wszystkich wskazówek

przenosze
sadistic_son
Pokaż więcej kodu. Przynajmniej while.
talkenberg
Oto więcej kodu:

  1. $iledni = (strtotime('2011-05-13')- strtotime('2011-04-01'))/86400;
  2.  
  3. $tabela = "CREATE TEMPORARY TABLE zakres (dni varchar(15))";
  4.  
  5. mysql_query($tabela,$conn);
  6. for($i=0; $i<= $iledni; $i++){
  7.  
  8.  
  9. $przedzial = date('Y-m-d',strtotime('+'. $i .' day', strtotime('2011-04-01')));
  10. settype($przedzial, "string");
  11. mysql_query("INSERT INTO zakres values('$przedzial')");
  12.  
  13.  
  14.  
  15.  
  16.  
  17. }
  18.  
  19. $oferta = "SELECT * FROM takepassenger WHERE from_date IN (SELECT dni FROM zakres) or to_date IN (SELECT dni from zakres)";
  20. echo $oferta;
  21. $listing = mysql_query($oferta) or die("coś poszło nie tak");
  22. while($rekord = mysql_fetch_object($listing)){
  23.  
  24. echo $rekord->from_place;
  25. echo '<br>';
  26. echo $rekord->from_date;
  27. echo '<br>';
  28.  
  29. }


Zaznaczam, że po usunięciu fragmentu od "OR" wszystko działa ok.

pmir13
1. Przekształcasz dwie daty w formacie obsługiwanym natywnie przez mysql na int.
2. Tworzysz dodatkową tymczasową tablicę w bazie.
3. Liczysz ile dni jest między datami, wstawiasz tyle rekordów ile jest dni, przekształcając daty z powrotem na format mysql.
4. Wszystko po to by sprawdzić, czy przedział czasowy wyznaczony przez te daty ma wspólną część z innym przedziałem branym z tabeli.

To wszystko nie trzyma się kupy. Po co?

Linie 1-18 są do usunięcia.
  1. $d1 = '2011-04-01'; $d2 = '2011-05-13';
  2. $oferta = "SELECT * FROM takepassenger WHERE from_date BETWEEN '$d1' AND '$d2' OR to_date BETWEEN '$d1' AND '$d2'";
talkenberg
Dzięki wielkie, nie wiem dlaczego nie przyszło mi do głowy takie prościutkie rozwiązanie. Lubię sobie chyba komplikować życie. Podstawy MySQL'a się kłaniają. Dzięki jeszcze raz.

PS. Ale pomijając moje bazgroły: kwerenda z dwiema subkwerendami nie zwraca wyniki w kodzie?
pmir13
Nie wiadomo, praktycznie nie wytłumaczyłeś na czym polega błąd, nawet nie podałeś go w oryginalnej wersji.
Tworzysz sobie tymczasową tabelę, więc nawet nie masz możliwości sprawdzenia zapytania bezpośrednio dając go do mysqla.
Chyba że stworzysz ją sobie ponownie ręcznie albo nie jako tymczasową.
Ogólnie za dużo zgadywania.

talkenberg
Jak pisałem wcześniej, gdy używam tylko sprawdzania IN dla date_from to wszystko działa w porządku. Mogę także pobierać dane z tymczasowej tabeli. Wystarczy jednak że dodam drugą podkwerendę i po ptokach.
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.