Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql/PHP] LEFT OUTER JOIN i podwójne wyciaganie danych z tej samej tabeli
Forum PHP.pl > Forum > Przedszkole
cytrysek
Witam,
zrobiłem sobie takie zapytanie:
  1. SELECT DISTINCT p.prop_co_ad_id, p.prop_zaco_ad_id, ad.ad_title, ad2.ad_title
  2. FROM zam714_prop p
  3. JOIN zam714_user u ON (p.prop_user_do_id = 423 )
  4. JOIN zam714_ad a ON (a.ad_owner=u.user_id)
  5. LEFT OUTER JOIN zam714_ad ad ON(ad.ad_id=p.prop_zaco_ad_id)
  6. LEFT OUTER JOIN zam714_ad ad2 ON(ad2.ad_id=p.prop_co_ad_id)


wyświetla to co chce, ale pojawia się problem dalej, otóż jak widać w zapytaniu, wyciągam 2x tą samą tabelę: ad_title, tyle, że za każdym razem wg innego id:

Kod
   prop_zaco_ad_id    |    ad_title        |  prop_co_ad_id  |   ad_title            
       11           |            opis1      |      16       |          tytul1
       2             |           opis2       |      5         |         tytul2
       2             |          opis2        |     11         |       tytul3


i teraz robię pętle w PHP:

  1. <?php
  2. $i=0;
  3. while ($row_prop3 = mysql_fetch_array($prop3))
  4. {
  5. $lProp3[$i]["ad_title"]=$row_prop3["ad_title"];
  6. $i++;
  7. }
  8. ?>


ale pokazuje tylko 1 wartość tytuł, a w zapyatniu mam: ad.ad_title, ad2.ad_title

Czy jest to możliwe, aby wyciągnąc w 1 zapytaniu 2 różne tytuły, zależne od innego id ?
Jak to poprawnie zapętlić ?

Dzięki za pomoc.
PW
Neeke
  1. SELECT DISTINCT p.prop_co_ad_id, p.prop_zaco_ad_id, ad.ad_title, ad2.ad_title AS tytul2
  2.  
  3. FROM zam714_prop p
  4. JOIN zam714_user u ON (p.prop_user_do_id = 423 )
  5. JOIN zam714_ad a ON (a.ad_owner=u.user_id)
  6. LEFT OUTER JOIN zam714_ad ad ON(ad.ad_id=p.prop_zaco_ad_id)
  7. LEFT OUTER JOIN zam714_ad ad2 ON(ad2.ad_id=p.prop_co_ad_id)


i uzycie :

[php]
cytrysek
Dzięki.
O to właśnie chodziło.

pzdr.
PW

No to jeszcze jedna kwestia:

Wyświetlam sobie dane wyciągnięte z poprzedniego zapytania w 2 komorkach tabeli:
Kod
tytul2 (2): faek (5)
tytul2 (2): łódka Bols (11)

...itd

a robie to tak:
  1. <?php
  2. $prop3=q($sql="select .....jak wyzej ");
  3. $i=0;
  4. while ($row_prop3 = mysql_fetch_array($prop3))
  5. {
  6. $lProp3[$i]["title_zaco_ad_id"]=$row_prop3["ad_title"];
  7. $lProp3[$i]["title_co_ad_id"]=$row_prop3["tytul2"];
  8.  
  9. $i++;
  10. }
  11. $tplMember->assign("prop_co",$lProp3);
  12. ?>


a ponieważ to SMARTY, to dalej:

  1. {section name=prop loop=$prop_co}
  2. <tr><td>
  3. {$prop_co[prop].title_co_ad_id} ({$prop_co[prop].propozycje_co_ad_id}): </td><td>
  4. {$prop_co[prop].title_zaco_ad_id} ({$prop_co[prop].propozycje_zaco_ad_id})
  5. <br></td></tr>
  6. {/section}



no dobra, a jak zrobić coś takiego:

Kod
tytul2 (2): faek (5)
                 łódka Bols (11)


czyli jeśli w pierwszej komórce id (w tym wypadku2) wystepuje wiecej niz 1 raz - to wyswietla sie on tylko raz, a w prawej komorce pozostale pasujace opisy pozostaja ?

pzdr.
PW
Neeke
niewiem czy dobrze zrozumialem i co do smartow to niestety nie znam sie na nich ale w zapytaniu masz mozliwosc na koncu dodania paru dodatkow takich jak GROUP BY np. ad2.ad_id moze oto ci chodzi GROUP BY jest stosowane do grupowania rekordów w bazie czyli jezeli masz np 3 rekrdy o tej samej dacie w tej samej tabeli mozesz je zgrupowac przez dodanie
np.
  1. $sql="select id from jakas_tabele where date=now() GROUP BY date ";

i wyswietli ci tylko jeden raz ta date
polecam troche manuala poczytac tam masz dokladnie opisane
cytrysek
hm, raczej nie nie GROUP, bo ogranicza mi wyniki...

tutaj raczej szukam jakies rozwiazania do samej prezentacji wynikow zapytania.
No chyba, że kolejny select w pętli ?

Chodzi po prostu o to, żeby w smarty fragment, który odpowiada za lewą komórkę :
  1. <?php
  2. {$prop_co[prop].title_co_ad_id} ({$prop_co[prop].propozycje_co_ad_id})
  3. ?>


pokazwył tylko unikalne wyniki, pamiętając, że pętla działa również do prawej komórki, a tam powinny pojawić się wyniki zależne od parametru z lewej komórki, a wiec moze byc ich wiecej.
nie wiem czy to jasno przedstawiłem.

dzieki.
PW
Neeke
Tu zabardzo Ci niepomoge jednak. Ale ja bym probowal z tym dodatkowym selectem w petli ..

pozdr.
cytrysek
Zrobione.

Trochę prób i udało się.
W PHP:
wrzucilem 2 selecty ale niezalażne od siebie (niezagniezdzone)

a w smarty 2 pętle od tych 2 selectow zagnieżdzone
a w srodku prosty warunek:

  1. <?php
  2. .....
  3. {section name=prop1 loop=$prop1}
  4. <td>
  5.  
  6. .. lewa kolumna
  7.  
  8. </td>
  9.  
  10. <td>
  11.  {section name=prop2 loop=$prop2}
  12. {if $prop1[prop1].1_ad_id == $prop2[prop2].2_ad_id}
  13.  
  14. .... prawa kolumna
  15.  
  16. {/if}
  17. {/section}
  18. </td>
  19.  
  20. {/section}
  21. ?>



i hula guitar.gif

pzdr.
PW
mpawel007
Dodaj alias przy wypisywaniu 1 tytulu
[code=sql]SELECT DISTINCT p.prop_co_ad_id, p.prop_zaco_ad_id, ad.ad_title as tytul, ad2.ad_title
from zam714_prop p
JOIN zam714_user u ON (p.prop_user_do_id = 423 )
JOIN zam714_ad a ON (a.ad_owner=u.user_id)
LEFT OUTER JOIN zam714_ad ad ON(ad.ad_id=p.prop_zaco_ad_id)
LEFT OUTER JOIN zam714_ad ad2 ON(ad2.ad_id=p.prop_co_ad_id)
[/code]
Wypisz tak:
Kod
<?php
<?php
$i=0;
while ($row_prop3 = mysql_fetch_array($prop3))
{
$lProp3[$i]["tytul"]=$row_prop3["ad_title"];
$i++;    
}
?>
?>



Dodaj alias przy wypisywaniu 1 tytulu
[code=sql]SELECT DISTINCT p.prop_co_ad_id, p.prop_zaco_ad_id, ad.ad_title as tytul, ad2.ad_title
from zam714_prop p
JOIN zam714_user u ON (p.prop_user_do_id = 423 )
JOIN zam714_ad a ON (a.ad_owner=u.user_id)
LEFT OUTER JOIN zam714_ad ad ON(ad.ad_id=p.prop_zaco_ad_id)
LEFT OUTER JOIN zam714_ad ad2 ON(ad2.ad_id=p.prop_co_ad_id)
[/code]
Wypisz tak:
Kod
<?php
<?php
$i=0;
while ($row_prop3 = mysql_fetch_array($prop3))
{
$lProp3[$i]["tytul"]=$row_prop3["ad_title"];
$i++;    
}
?>
?>

Nie wiem czy o to chodzilo ale mniej wiecej tak to zrozumiałem
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.