Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mysql_query i podkwerenda - składnia
talkenberg
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.11.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Tu masz napisane co się w takim przypadku robi
Temat: Jak poprawnie zada pytanie
zastosuj się do wszystkich wskazówek

przenosze


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sadistic_son
post
Post #3





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Pokaż więcej kodu. Przynajmniej while.


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
talkenberg
post
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.11.2007

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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'";


Ten post edytował pmir13 27.04.2011, 17:26:17
Go to the top of the page
+Quote Post
talkenberg
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.11.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował talkenberg 27.04.2011, 18:00:51
Go to the top of the page
+Quote Post
pmir13
post
Post #7





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
talkenberg
post
Post #8





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.11.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 06:49