Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak wyciagnac dane z dwoch tabel naraz?
Forum PHP.pl > Forum > Bazy danych
noose
Witam smile.gif
Dzisiaj dysponuje takim czyms. pisze wlasne forum i z wiadomych powodow potrzebuje, aby mozna bylo wyciagac dane z dwoch tabel na raz winksmiley.jpg moze opisze to jasniej winksmiley.jpg

tabela topici
Kod
ID_topicu | nazwa_topicu | kto | wpis | data | host

tabela userzy
Kod
ID_usera | nazwa_usera | data_ostatniego logowania | data_przylaczenia | podpis | miejscowosc

i teraz:
w tabeli topici jest rubryka KTO i tam jest zapisywana nazwa usera. chce, zeby na tej podstawie byly pobierane dane z tabieli userzy winksmiley.jpg jak to zrobic :?: bo ja mysle juz dwa dni i jakos nie moge wpasc na to (moze to przez niewyspanie :?: :?: winksmiley.jpg)
z gory thx winksmiley.jpg
podro 4 @ll
adwol
Cytat
w tabeli topici jest rubryka KTO i tam jest zapisywana nazwa usera. chce, zeby na tej podstawie byly pobierane dane z tabieli userzy winksmiley.jpg

Wersja najprostsza:
[sql:1:6582b2782e]select * from topici,userzy where nazwa_usera=kto[/sql:1:6582b2782e]
ale może będziesz potrzebował czegoś bardziej skomplikowanego.
noose
nie wiem gdzie to wkleic :?
to moze zrobimy tak winksmiley.jpg

[php:1:a029fc0a7a]<?php
session_start();
if (!isset($_SESSION["login"])){
header("Location: login.php");
exit();
}
?><html>
<?
include("config.cfg");
echo("<title> Forum $nazwa_strony </title>");
?><table border="1">
<?
include("config.cfg");
$db=mysql_connect("$sql_host", "$sql_user", "$sql_pass");
mysql_select_db("$sql_base", $db);
$sql="SELECT * FROM topici WHERE topic_id='$topic'";
$rezulat=mysql_query($sql);
$topic_id=$topic;
while ($row = mysql_fetch_array($rezulat))
{
$kto=$row["kto"];
$data=$row["data"];
$wpis=$row["wpis"];
$forum_id=$row["forum_id"];
$host=$row["host"];
$nazwa_topicu=$row["nazwa_topicu"];
echo("<center>Nazwa topicu: $nazwa_topicu <hr></center>n");
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%"><p>Data: $data</p></td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$topic_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$topic_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id&forum=$forum_id">Odpowiedz</a></td></tr>n");
}

$sql2="SELECT * FROM topici WHERE odpowiedz='$topic_id'";
$result2=mysql_query($sql2);
while ($row = mysql_fetch_array($result2))
{
$kto=$row["kto"];
$data=$row["data"];
$wpis=$row["wpis"];
$forum_id=$row["forum_id"];
$host=$row["host"];
$topic_id=$row["topic_id"];
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%">Data: $data</td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$topic_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$topic_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id&forum=$forum_id">Odpowiedz</a></td></tr>n");
}

?>
</table><pre><a href="wyloguj.php">Wyloguj</a></pre>
<pre><a href="index.php">Glowna strona forum</a></pre>
</html>[/php:1:a029fc0a7a]

gdzie :?: winksmiley.jpg
sivyer
[sql:1:3ac0450845]SELECT t.*,u.* FROM topici t LEFT OUTER JOIN userzy u ON t.kto=u.nazwa_usera[/sql:1:3ac0450845]

a moze cos takiego?
noose
mozesz mi wyjasnic ja do czego slozy :?: bo nie rozumiem tego zapytania sad.gif no i gdzie to wsadzic w kodzie :?: :?:
adwol
Cytat
nie wiem gdzie to wkleic :?

gdzie :?: winksmiley.jpg

Tam gdzie masz zapytania czyli w liniach 16 i 36.
noose
Witam
to znowu ja:)
nie moge sobie z tym poradzic sad.gif w ogole mi nie lapie niczego sad.gif

[php:1:a060af7522]<? include("include.inc");?><html>
<?
include("config.cfg");
echo("<title> Forum $nazwa_strony </title>");
?><table border="1">
<?
$i=3;
include("config.cfg");
$db=mysql_connect("$sql_host", "$sql_user", "$sql_pass");
mysql_select_db("$sql_base", $db);
$sql="SELECT nazwa_topicu FROM topici WHERE topic_id='$topic'";
$rezulat=mysql_query($sql);
$topic_id=$topic;
while ($row = mysql_fetch_array($rezulat))
{
$nazwa_topicu=$row["nazwa_topicu"];
echo("<center>Nazwa topicu: $nazwa_topicu <hr></center>n");
}
$sql2="SELECT p.*,u.* FROM posty p LEFT OUTER JOIN users u ON t.kto=u.nazwa_usera";
$rezulat2=mysql_query($sql2);
while ($row = mysql_fetch_array($rezulat2))
{
$kto=$row["p.kto"];
$data=$row["p.data"];
$wpis=$row["p.wpis"];
$host=$row["p.host"];
$post_id=$row["p.post_id"];
$podpis=$row["u.podpis"];
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%"><p>Data: $data</p></td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$post_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$post_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id">Odpowiedz</a></td></tr>n");
}
?>
</table><pre><a href="wyloguj.php">Wyloguj</a></pre>
<pre><a href="index.php">Glowna strona forum</a></pre>
</html>
<? include("include_dol.inc");?>[/php:1:a060af7522]

sytuacja sie troche zmienila
posty sa w tabeli posty, nazwa topicu itp w tabeli topici a dane o userach w tabeli users.
mozecie mi pomoc :?:
Gumiak
Do sivyer i nie tylko :wink: :

Użyłem do podobnej sprawy twojego kodu:

[sql:1:e6922608cf]SELECT t.*,u.*
FROM topici t LEFT OUTER JOIN userzy u ON t.kto=u.nazwa_usera[/sql:1:e6922608cf]

i działa mi bez zarzutu, ale chciałbym w ten sam sposob porobic wiecej polaczen, bo chcialbym w odpowiednie pola w tabeli news powstawiac liczby, ktore mialyby odpowiadac id w innej tabeli (np. w kat 1 to zeby wyciagnac z tabeli kategoria, gdzie id_kat=1 inne pola np. nazwa_kat i opis_kat). I tak jesli wstawie w tabeli news w pole kat 1 a nie wstawie nazwe kategorii, to pozniej przy ew. zmianach zmieniajac nazwe kategorii w tabeli kategoria w efekcie na stronie we wszystkich newsach zmieni mi sie automatycznie.

O cos takiego mi chodzi ale jak zrobic poprawnie takie polaczenie dla powiedzmy 5,6 tabel?

mam np. tabele news (pola potrzebne mi do polaczenia
Kod
ID | kat_id | autor_id | obrazek_id | zrodlo_id

tabele kategoria
Kod
ID_kat | nazwa_kat | opis_kat

tabele zrodlo
Kod
ID_zr | nazwa_zr | opis_zr


itd.

jakby ktos nie rozumial mojej paplaniny to gg: 1142714
Gumiak
dobra dzieki juz sobie poradzilem

a dziala mi to na takiej zasadzie:
Kod
$q = "SELECT * FROM newsy n, news_users u, news_kat k WHERE n.podpis = u.id and n.kat = k.kat_id";



$res = mysql_query($q);

$rows = mysql_num_rows($res);



// je&para;li nie ma wpisow w tabeli 'newsy' to informuje, ze brak wiadomosci

if ($rows == 0) { echo "Nie ma jeszcze żadnych wiadomo&para;ci"; }



// je&para;li sa wpisy, to wyswietla je

else {

while ($row = mysql_fetch_array($res)) {



echo "$row[tytul] <a href="mailto:$row[mail]">$row[imie] $row[nazwisko]</a> $row[n_kat]<br>";

}

}
noose
Gumiak moze chociaz Ty mi pomozesz....

[php:1:d43704f69d]<?
include("config.cfg");
$db=mysql_connect("$sql_host", "$sql_user", "$sql_pass");
mysql_select_db("$sql_base", $db);
$sql="SELECT t.*,u.* FROM topici t LEFT OUTER JOIN users u ON t.kto=u.nazwa_usera WHERE topic_id = '$topic_id'";
$rezulat=mysql_query($sql);
$topic_id=$topic;
while ($row = mysql_fetch_array($rezulat))
{
$nazwa_topicu=$row["t.nazwa_topicu"];
echo("<center>Nazwa topicu: $nazwa_topicu <hr></center>n");
$kto=$row["u_kto"];
$data=$row["u_data"];
$wpis=$row["u_wpis"];
$host=$row["u_host"];
$post_id=$row["u_post_id"];
$podpis=$row["u.podpis"];
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%"><p>Data: $data</p></td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$post_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$post_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id">Odpowiedz</a></td></tr>n");
}

?>[/php:1:d43704f69d]
co tu jest zle :?: nic sie nie wyswietla:(
FiDO
Jesli nic sie nie wyswietla to znaczy ze petla ani razu sie nie wykonuje, co znaczy ze $rezultat albo nie zwraca ani jednego wiersza.. albo nastapil blad polaczenia z baza/wybrania bazy/wykonania zapytania.
Przerob poczatek na taki kod to bedziesz wiedzial co dokladnie:
[php:1:dff1e40660]<?php
$db = mysql_connect("$sql_host", "$sql_user", "$sql_pass") od die(mysql_error());
mysql_select_db("$sql_base", $db) or die(mysql_error());
$sql="SELECT t.*,u.* FROM topici t LEFT OUTER JOIN users u ON t.kto=u.nazwa_usera
WHERE topic_id = '$topic_id'";
$rezulat=mysql_query($sql) or die(mysql_error());
...
?>
[/php:1:dff1e40660]
I pokaz co Ci wyswietla..
noose
poprawilem to bo mi blad wyskakiwal
[php:1:940b0cc8bb]<?
include("config.cfg");
$db = mysql_connect("$sql_host", "$sql_user", "$sql_pass") or die(mysql_error());
mysql_select_db("$sql_base", $db) or die(mysql_error());
#POPRAWIONE
$sql="SELECT t.*,u.* FROM topici t LEFT OUTER JOIN users u ON t.kto=u.user_name
WHERE topic_id = '$topic_id'";
$rezulat=mysql_query($sql) or die(mysql_error());
$topic_id=$topic;
while ($row = mysql_fetch_array($rezulat))
{
$nazwa_topicu=$row["topici.nazwa_topicu"];
echo("<center>Nazwa topicu: $nazwa_topicu <hr></center>n");
$kto=$row["u_kto"];
$data=$row["u_data"];
$wpis=$row["u_wpis"];
$host=$row["u_host"];
$post_id=$row["u_post_id"];
$podpis=$row["u.podpis"];
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%"><p>Data: $data</p></td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$post_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$post_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id">Odpowiedz</a></td></tr>n");
}

?>[/php:1:940b0cc8bb]

teraz mi sie nie wyswietla zaden blad, ale nadal jest pusto sad.gif
uboottd
http://forum.php.pl/viewtopic.php?t=789

oraz na pewno podajesz id topicu istniejacego w bazie ?
noose
o super globalnych nie musisz mi pisac smile.gif mam je zadeklarowane w innym kawalku kodu (jak sie strona zaczyna tongue.gif). id_topicu istnieje .... :?

edit: jest poprawa tongue.gif nie zmieniajac kodu, odpallila mi sie ta petla.... tyle, ze pusta :? tzn to co jest w echo sie wyswietla, ale to co jest w zmiennych jest puste sad.gif
xamel
zrob tak : zadaj to zapytanie bezposrednio w bazie danych i zobacz czy dostaniesz wynik !!!
ja osobiscie zadko korzystam z JOIN
tam wystarczy
Select u.*,t.* from table1 as t, table2 as u Where t.topic_id = '$topic_id' and t.kto = u.user_name


aha w twoim $sql jest blad
WHERE topic_id = '$topic_id'";

powinno byc WHERE t.topic_id = '$topic_id'

nie wiem moze MySQL radzi sobie tez z tym co ty dales ale formalnie lepiej jest tak jak u mnie

zeby wiedziec jakie zadajesz pytanie bazie danych zrob PRZED mysql_query : echo $sql i zobacz co ci pokaze przegladarka (wklej do bazy jako pytanie i zobacz co dostaniesz w odpowiedzi)
noose
poprawilem troche kod (bo phpmyadmin wychodzilo prawie tak jak mialo wyjsc tongue.gif)
[php:1:14ad22bcc2] include("config.cfg");
$db = mysql_connect("$sql_host", "$sql_user", "$sql_pass") or die(mysql_error());
mysql_select_db("$sql_base", $db) or die(mysql_error());
$sql="SELECT t.*,u.* FROM topici t LEFT OUTER JOIN users u ON t.kto=u.user_name WHERE topic_id = '$topic_id' ";
$rezulat=mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_array($rezulat))
{
$nazwa_topicu=$row["nazwa_topicu"];
echo("<center>Nazwa topicu: $nazwa_topicu <hr></center>n");
$kto=$row["kto"];
$data=$row["data"];
$wpis=$row["wpis"];
$host=$row["host"];
$post_id=$row["post_id"];
$podpis=$row["u.podpis"];
echo("<tr>n<td width="60%"><p>$kto napisal: </p><p>$wpis</p></td>n
<td width="10%"><p>Data: $data</p></td>");
if ($_SESSION["user_stat"] != 0) { echo("<td width="20%">n
<a href="skasuj.php?id=$post_id">Skasuj topic</a><br>
<a href="moderuj.php?topic=$post_id">Edytuj</a><br><p>Host: $host</p></td>"); }
echo("<td><a href="odpowiedz.php?topic=$topic_id">Odpowiedz</a></td></tr>n");
}[/php:1:14ad22bcc2]

i teraz mam pytanie.... jak do tego zapytania dodac jeszcze, zeby wpisy bral z tabeli posty (kolumna sie zwie odpowiedz_id i powinna byc powiazana z topic_id ) :?:
[sql:1:14ad22bcc2]SELECT t.*,u.* FROM topici t LEFT OUTER JOIN users u ON t.kto=u.user_name WHERE topic_id = '$topic_id' [/sql:1:14ad22bcc2]

pytam sie bo na sql'u az tak sie nie znam sad.gif
xamel
jak ma byc powiazana?
odpowied_id = topic_id ?
czy w posty masz topic_id i chcesz wyswietlic odpowiedz_id?


a w poprzednim kodzie (przed ostatnia poprawka) miales przypisywanie $topic_id = PO $slq= gdzie wykorzystywales $topic_id,czyz nie?
noose
powinno byc tak
posty odpowiedz_id = topoci topic_id
jedno z drugim ma byc powiazane i ma sie wyswietlac zawartosc tabeli posty

o co Ci chodzi z tym poprzednim kodem :?:
powyzej tego kodu mam zadeklarowane
[php:1:77e5ff3587]$topic_id=$_GET["topic_id"];[/php:1:77e5ff3587]
jezeli o to chodzi tongue.gif
xamel
try:
SELECT t.*,u.*,p.*
FROM topici t, users u,posty p
WHERE topic_id = '$topic_id' AND t.kto=u.user_name
AND p.odpowiedz_id=t.topic_id

a z poprzednim kodem oto mniej wiecej chodzi co napisales
noose
prawie dziala ;]
wyswietlaja mi sie posty, autorzy, topici iitp.... ale podpis bierze od goscia ktory napisal post :? jakas rada :?:
noose
dobra, nie wazne tongue.gif juz dziala ;]

[sql:1:e62a52d88d]SELECT t.*,u.*,p.*
FROM topici t, users u,posty p
WHERE topic_id = '$topic_id' AND p.kto=u.user_name
AND p.odpowiedz_id=t.topic_id [/sql:1:e62a52d88d]

dzieki wszystkim za pomoc smile.gif
Gumiak
Więc ja mam taki problem:

[php:1:8ae4548891]<?php// wybiera wszystkie wpisy z tabeli newsy i sortuje wg. daty
$q = "SELECT * FROM news n, news_users u, news_dzial d where (n.news_kat_id=d.dzial_id) && (u.user_id=n.news_autor_id) order by 'news_id' desc limit 0,7";
$res = mysql_query($q);
$rows = mysql_num_rows($res);

// je&para;li nie ma wpisow w tabeli 'newsy' to informuje, ze brak wiadomosci
if ($rows == 0) { echo "Nie ma jeszcze żadnych wiadomo&para;ci"; }

// je&para;li sa wpisy, to wyswietla je
else {
while (($row = mysql_fetch_array($res)) ) {


echo "<table width='460' border=0 cellspacing=0 cellpadding=0>";
echo "<tr><td colspan='2' class=tytul><img src=img/ko.gif><b>&nbsp;$row[news_tytul]</b></td></tr>";
echo "<tr><td height='16' valign='middle' class=data><font color='#696969'>$row[news_data]</font><b> - <a href='' class=kategoria>$row[dzial_opis]</a> - <a class=podpisik HREF=mailto:$row[user_email]>$row[username]</a></b></td></tr>";
echo "<tr><td colspan=2 class=tresc>";
if (($row[news_obrazek_id])!=0) {
$w = "SELECT * FROM news n, news_obrazek o WHERE (n.news_obrazek_id=o.obrazek_id) limit 1";
$res2 = mysql_query($w);
while ( ($row2 = mysql_fetch_array($res2)) ) {
echo "<img src='$row2[obrazek_url]' align=left border=1>";
}
}?>[/php:1:8ae4548891]
i dalej tez wyciaganie z innej tabeli jesli if spelniony, ale niewazne

Glowny problem tkwi w drugim zapytaniu ($w) w tym, ze niby drukuje wszystko ladnie ale wszedzie to samo (niezaleznie od wartosci w tabeli news w komorce news_obrazek_id). A chce zrobic ze jesli w tabeli news news_obrazek_id =1 to drukuje wszystko z tabeli obrazek gdzie obrazek_id tez =1. A narazie tak mi drukuje ale wszedzie to samo.
Prosze pomocy, bo stoje z dalsza robota.

Bo chcialem na poczatku wszystko wrzucic do pierwszego zapytania $q, ale tam musze laczyc and albo or i jak robie wiecej polaczen to albo znajduje mi i drukuje wszedzie albo wcale, bo nie wszedzie w news_obrazek_id (tabela news) jest wartosc. Wartosc wpisze tam tylko jesli bede chcial w newsie zobaczyc obrazek.
noose
mistrzem nie jestem ale wydaje mi sie, ze w zapytaniach sql sie nie stosuje && tylko AND
[sql:1:0a78fd6404]"SELECT * FROM news n, news_users u, news_dzial d where (n.news_kat_id=d.dzial_id) AND (u.user_id=n.news_autor_id) order by 'news_id' desc limit 0,7[/sql:1:0a78fd6404]

ale co wiecej to nie mam pojecia sad.gif
Gumiak
[sql:1:f9c8fff4c2]$q = "SELECT *
FROM news n
INNER JOIN news_users u ON u.user_id = n.news_autor_id
INNER JOIN news_dzial d ON n.news_kat_id = d.dzial_id
LEFT JOIN news_obrazek o ON n.news_obrazek_id = o.obrazek_id
LEFT JOIN news_zrodlo zr ON n.news_zrodlo_id = zr.zrodlo_id
ORDER BY n.news_id DESC
LIMIT 0 , 7";[/sql:1:f9c8fff4c2]

juz dziala 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.