Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] łączenie zapytań
Forum PHP.pl > Forum > PHP
oximus
witam, mam taki problem, że nie potrafię wyniku zapytania z jednej tabeli wprowadzić jako zmienną do szukania w zapytaniu w drugiej tabeli...może przykład:

  1. <?php
  2. require_once ('mysql_connect.php');
  3.  
  4. $query='SELECT Prefix, Text, Whenl, Crossing_Id FROM events WHERE prefix=\"*\" ORDER BY Whenl DESC LIMIT 1';
  5. $result = mysql_query($query) or die ('blad:' . mysql_error());
  6. while (list($Prefix, $Text, $Whenl, $Crossing_Id) = mysql_fetch_row($result)){
  7. $strDate = &#092;"$Whenl\";
  8. $strYear  = substr( $strDate, 0, 4 );
  9. $strMonth = substr( $strDate, 4, 2 );
  10. $strDay = substr( $strDate, 6, 2 );
  11. $strHour  = substr( $strDate, 8, 2 );
  12. $strMinute = substr( $strDate, 10, 2 );
  13. $strSecond = substr( $strDate, 12, 2 );
  14. $strDate = $strYear . '-' . $strMonth . '-' . $strDay . ' ' . $strHour . ':' . $strMinute . ':' . $strSecond;
  15. $pytanie='SELECT Name FROM crossing WHERE Id=\"$Crossing_Id\"';
  16. $wynik = mysql_query($pytanie) or die ('blad:' . mysql_error());
  17. while (list($Name) = mysql_fetch_row($wynik)){
  18. echo (&#092;"$Name\");
  19. }
  20. echo (&#092;"$Text\");
  21. ?>
  22. <br>
  23. <br>
  24. <?php
  25. echo(&#092;"$strDate\");
  26. } 
  27. ?>

Nie bierze mi pod uwagę w ogóle zapytania drugiego, chociaż bład nie wyskakuje. Wyświetla wynik pierwszego zapytania. Jeśli napisałem jakiś bzdurny kod to wynika to z mojej tygodniowej znajomości z php, za co przepraszam.
nospor
A nie prościej użyć jednego zapytania:
  1. SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name
  2. FROM events e, crossing c WHERE e.Prefix="*" AND e.Crossing_Id=c.Id

A tak pozatym zamiast
echo ("$cos");
dawaj
echo $cos;
efekt taki sam, a bardziej przejżyste
oximus
No, ok, efekt jest taki sam, dzieki, ale dalej nie moge dowiedziec sie jaka jest nazwa NAME skrzyzowania CROSSING, ktore zostalo wskazane jako ostatnie. Poza tym nie rozumiem tych 'e', 'c' w zapytaniu, gdzie o tym poczytac, w ksiazce nie mam.
SongoQ
  1. <?php
  2. $pytanie='SELECT Name FROM crossing WHERE Id= '$Crossing_Id'';
  3. ?>


Cytat
Poza tym nie rozumiem tych 'e', 'c' w zapytaniu, gdzie o tym poczytac, w ksiazce nie mam.

Szukaj o alias do tabeli
nospor
e i c to aliasy tabel (żeby było krócej)
Jak cchesz nazwę, to:
while (list($Prefix, $Text, $Whenl, $Crossing_Id,$name) = mysql_fetch_row($result))
oximus
Dobra chłopaki i tak mi to nie działa - nie wiem czemu...ale dzieki za pomoc...jakoś to obejdę...
nospor
OJ szybko się poddajesz. Jakbyś pokazał teraz nowy kod, z tym co ci zapropponowalem, może da się coś zrobić
oximus
juz zglupialem...jeszcze mam pytanie gdzie w Twoim zapytaniu wcisnac DESC? bo to musi byc ostatnie pole prefix z '*'!
  1. <?php
  2. require_once ('mysql_connect.php');
  3.  
  4. $query='SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name 
  5. FROM events e, crossing c WHERE e.Prefix=\"*\" and e.Crossing_Id=c.Id LIMIT 1';
  6. $result = mysql_query($query) or die ('blad:' . mysql_error());
  7. while (list($Prefix, $Text, $Whenl, $Crossing_Id) = mysql_fetch_row($result)){
  8.  
  9. $pytanie='SELECT Name FROM crossing WHERE Id='$Crossing_Id'';
  10. $wynik = mysql_query($pytanie) or die ('blad:' . mysql_error());
  11. while (list($Name) = mysql_fetch_row($wynik)){
  12. echo $Name;
  13. }
  14. echo $Text, $Whenl;
  15. } 
  16. ?>
nospor
  1. <?php
  2.  
  3. require_once ('mysql_connect.php');
  4.  
  5. $query='SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name 
  6. FROM events e, crossing c WHERE e.Prefix=\"*\" and e.Crossing_Id=c.Id ORDER BY e.Whenl DESC LIMIT 1';
  7. $result = mysql_query($query) or die ('blad:' . mysql_error());
  8. while (list($Prefix, $Text, $Whenl, $Crossing_Id,$Name) = mysql_fetch_row($result)){
  9.  
  10. echo $Name;
  11. echo $Text.$Whenl;
  12. }
  13.  
  14. ?>
oximus
Nospor, jesteś koleś smile.gif.. dzięki!

Mam jeszcze przed sobą ostatnie, najtrudniejsze wg mnie zadanie...oczywiście proszę o pomoc. Wiec, mam powyższy skrypt, który pięknie działa.
Oto interesująca mnie tabela:

Więc zadanie jest takie:
Czeszemy bazę od dołu (to juz mamy). Jak pierwsza od dołu będzie gwiazdka to wyświetlam info o niej (to też już mam). Natomiast jeśli pierwszy od dołu wpis bedzie zawierał słowo "Reset" (niestety w kolumnie "Text") czyli bedzie przed gwiazdka (od dołu) to wtedy np: echo('OK');
Sytuacja na jpg przedstawia stan kiedy skrypt, ktory mam, dziala poprawnie. Jednak gdyby wywalic ostatnia gwiazdke z kolumny 'prefix' musiałby załapać słowo 'Reset' z kolumny "text" i pokazac ze wszystko gra, a tego nie robi.
Help, chyba musze sie przespac...zle skladam zdania..;]
Bardzo proszę na pomoc, bo jutro muszę to pokazać prowadzącemu.

Wydaje mi sie, ze mozna to zrobic przez mysql_num_rows...ale nie jestem pewnien...
SongoQ
Moze cos ze zlaczeniami LEFT JOIN, niestety nie mam dostepu teraz do MySQLa wiec zapytanie moze nie dzialac prawidlowo.

  1. SELECT *
  2. FROM events a LEFT JOIN events b ON (a.id = b.id + 1)
  3. WHERE a.Prefix = '*' AND b.Text LIKE 'Reset%'
  4. ORDER BY a.Whenl DESC LIMIT 1
nospor
  1. <?php
  2.  
  3. require_once ('mysql_connect.php');
  4.  
  5. $query='SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name 
  6. FROM events e, crossing c WHERE (e.Prefix=\"*\" or e.Text LIKE 'Reset%' ) and e.Crossing_Id=c.Id ORDER BY e.Whenl DESC LIMIT 1';
  7. $result = mysql_query($query) or die ('blad:' . mysql_error());
  8. while (list($Prefix, $Text, $Whenl, $Crossing_Id,$Name) = mysql_fetch_row($result)){
  9.  
  10. if (strstr($Text, 'Reset'))
  11.  echo &#092;"ok text=reset\";
  12. else
  13. echo &#092;"prefix=*\"; 
  14. }
  15.  
  16. ?>
oximus
W 6 linijce jest parse error, chyba chodzi mu o wyrażenie 'Reset%'. Jak wrzucam je w cudzysłów to skrypt działa, ale niezależenie od zmian w bazie pokazuje Prefix=*.
nospor
spróbuj tak
  1. <?php
  2.  
  3. require_once ('mysql_connect.php');
  4.  
  5. $query='SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name 
  6. FROM events e, crossing c WHERE (e.Prefix=\"*\" or e.Text LIKE '%Reset%' ) and e.Crossing_Id=c.Id ORDER BY e.Whenl DESC LIMIT 1';
  7. $result = mysql_query($query) or die ('blad:' . mysql_error());
  8. while (list($Prefix, $Text, $Whenl, $Crossing_Id,$Name) = mysql_fetch_row($result)){
  9.  
  10. if (strstr($Text, 'Reset'))
  11.  echo &#092;"ok text=reset\";
  12. else
  13. echo &#092;"prefix=*\"; 
  14. }
  15.  
  16. ?>
oximus
no ok jest blisko, bo jak wywaliłem ten tekstowy syf w kolumnie Text po wyrazie 'Reset' to zaskoczylo...czyli blad musialby byc w linijce 12...tam musiałoby być coś takiego jak 'reset%' ale tak to nie dziala smile.gif
nospor
to wkoncu dziala, czy nie dziala, bo nie zajarzylem Twojej wypowiedzi
oximus
Nie działa smile.gif, bo widzisz ja dostaje komunikat do bazy od sterownika. Tam natomiast jest wyraz "RESET" + jakies syfy typu, "Cl","log" (maszynowe bzdety) a to mnie nie interesuje. Mnie interesuje słowo "RESET". Twoj skrypt zadziała gdy ktoś przeprogramuje sterownik, żeby wysyłał czyste słowo "RESET". Niestety to niemożliwe. smile.gif


Dziwne, po paru refreshach zaczeło działać...hmmm...dziwne..dzieki Nospor!
nospor
Oj nie kumam. Ma być samo slowo reset? W czym problem?
... e.Text = \'Reset\' ....
teraz bedzie szukal tylko slowa Reset
oximus
Działa, działa...znowu dziekuję smile.gif
SongoQ
Zapytanie jest dokonca niepoprawnie skonstruowane. Napisales powyzej ze jesli pojawi sie okreslony prefix a nastepnie slowo reset to wtedy powinno dzialac. To co CI napisal @nospor nie uwzgledni tego poniewaz zwraca 2 rekordy o okreslonych parametrach nie sprawdza czy sa obok siebie. Mozesz latwo zrobic test wstaw miedzy reset a * jakis rekord i tak naprawde nie powinien tego uwzglednic, a w przypadku powyzej pokaze sie.

Dla zalozenia ze nie jest wazne ustawienie tych rekordow to bedzie dzialac, a jesli to jest wazne to nie zadziala.
oximus
Reset i * lub + nie mogą być koło siebie. Jest to nielogiczne. Jesli pierwszy od dolu jest reset to jest ok. Jesli pierwsza od dolu jest * lub + jest blad.
  1. <?php
  2.  
  3. require ('mysql_connect.php');
  4.  
  5. $query='SELECT e.Prefix, e.Text, e.Whenl, e.Crossing_Id,c.Name 
  6. FROM events e, crossing c WHERE (e.Prefix=\"*\" or e.Prefix =\"+\" or e.Text LIKE '%Reset%' ) and e.Crossing_Id=c.Id ORDER BY e.Whenl DESC LIMIT 1';
  7. $result = mysql_query($query) or die ('blad:' . mysql_error());
  8. while (list($Prefix, $Text, $Whenl, $Crossing_Id,$Name) = mysql_fetch_row($result)){
  9.  
  10. if (strstr($Text, 'Reset')){
  11. echo'<FONT COLOR=\"green\">';
  12. echo'<FONT SIZE=\"30\">';
  13.  echo &#092;"OK\";
  14. echo'</FONT></FONT>';
  15. }else{
  16. echo'<FONT COLOR=\"red\">';
  17. echo'<FONT SIZE=\"30\">';
  18. echo &#092;"BŁĄD\"; 
  19. echo '<br>';
  20. echo'</FONT>';
  21. $strDate = &#092;"$Whenl\";
  22.  
  23. $strYear  = substr( $strDate, 0, 4 );
  24. $strMonth = substr( $strDate, 4, 2 );
  25. $strDay = substr( $strDate, 6, 2 );
  26. $strHour  = substr( $strDate, 8, 2 );
  27. $strMinute = substr( $strDate, 10, 2 );
  28. $strSecond = substr( $strDate, 12, 2 );
  29.  
  30. $strDate = $strYear . '-' . $strMonth . '-' . $strDay . ' ' . $strHour . ':' . $strMinute . ':' . $strSecond;
  31. echo $Name;
  32. echo '<br>';
  33. echo $Text;
  34. echo '<br>';
  35. echo $strDate;
  36. echo '<br>';
  37. echo'</FONT>';
  38. }
  39. }
  40. ?>
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.