[SQL] От две таблици в една

SayliS

Registered
Добър вечер, (може би добро утро... :П) стигнах до момента в който трябва да извлека информация от 2 таблици, като едната е зависима от другата:

Код:
$query = "SELECT first_name, last_name, username, admin_level, id FROM admin LEFT JOIN status ON (id_status = admin_level) ORDER By username";
	$result = mysql_query($query) or die (mysql_error()); 
	?>
	
	<table width="55%" border="1" cellpadding="2" cellspacing="2" align="center">
	 <tr>
	  <th>Потребител</th>
	  <th>Име</th>
	  <th>Статус</th>
	  <th>Обнови</th>
	  <th>Изтрий</th>
	 </tr>
	 <?php
	 $users = "";
	while ($row = mysql_fetch_array($result)) {
		$u_name = $row['username'];
		$f_name = $row['first_name'];
		$l_name = $row['last_name'];
		$a_level = $row['admin_level'];
		$r_id = $row['id'];
Проблема е че $a_level си седи цифра(както е в таблица admin) а не дума(таблица status колона adm_status ).
Има ли начин да го изведа с данните от таблица status с една заявка?

Ако използвам foreach($row as $value) присфоявам всичко а немога да присфоя само реда който ми трябва.
 

Admin

Registered
Дай двете таблици ( имената им и имената на полетата) и кажи какво искаш да направиш.
Заявката е много лесна ако имат поле което се повтаря (връзката между таблците) и в двете таблици.

Те явно имат общо поле щом искаш да правиш връзка между тях.
 

sizif

Registered
Здравейте!

Тъкмо задавах подобен въпрос :)
Админ, ако не те затруднявам, като пускаш решението, може ли да обясниш по-подробно?
 

Admin

Registered
Таблица user_name

id_user
user_name
reg_date

Таблица obiava
id
id_user
zaglavie

искаш да разбереш коя обява кой потребител я е пуснал .


$query="SELECT * from user_name,obiava where user_name.id_user=obiava.id_user ";
$result=mysql_query($query);
$num=mysql_num_rows($result);

for ($i=0; $i<$num;$i++)
{

$user= mysql_result($result,$i,"user_name.user_name");
$zaglavie= mysql_result($result,$i,"obiava. zaglavie");
echo $user." e написал обява с име ".$zaglavie."<br/>;

}



така от две таблици правиш една по дълга. :)

Може и така:

$query="SELECT * from user_name,obiava where user_name.id_user=obiava.id_user and user_name.user_name='sizif' ";
$result=mysql_query($query);
$num=mysql_num_rows($result);

for ($i=0; $i<$num;$i++)
{

$user= mysql_result($result,$i,"user_name.user_name");
$zaglavie= mysql_result($result,$i,"obiava. zaglavie");
echo $user." e написал обява с име ".$zaglavie."<br/>;

}


Ще ти изведе обявите които ти си писал и техните имена.

Ти ще ме разбереш sizif.
Трябва да представяш всеки обект с таблица.

user ите са един обект с техните атрибути (имат име, ид , дата на раждане и т.н.)

obiavite също са отделен обект и те имат своите специфични атрибути.

(id, avtor, data, zaglavie).

Не може в една таблица да се съхраняват и атрибутите на
автора и на обявата).

В таблицата на обявата се записва само ИД то на автора и това е достатъчно.
Ти с една такава заявка може да обединиш3-4 и повече таблици .

Ще схванеш.
А схванеш ли вече ще ти стане много ясно защо се нарича "релационна база данни". :)

Пиша наизуст и е 2.30.
Ще ме извините ако имам грешки в кода и правописа.
 

Admin

Registered
Забравих да спомена нещо.
По-интересни са връзки от сорта "много към много" .

Пример.
В момента има в web-tourist две таблици.
Едната е за уроците, другата е за потребителите.

Същите тези потребители сега искат да имат секция "любими уроци".

За целта правя (това правех преди да се хвана да ти обяснявам)
3-та таблица.
Там описвам точно това "кой какви уроци е маркирал като любими" .

В тази малка табличка описвам връзките между таблицата на
потребителите и таблицата на уроците.

Нарича се "много към много", защото един потребител може да има
много любими уроци но в същото време един урок може да е любим на много потребители.

Ето какво представлява таблицата lubimi_uroci

id_lubimi | id_user | id_urok

1 2 3
2 2 4
3 3 3
4 17 5

вижда се, че потребител с id 2 има любими уроци с id 3 и 4
потребител с id 3 има любим урок с id 3
потребител с id 17 има любим урок с id 5

в същото време се вижда, че урок с ид 3 е любим на потребители
с id 3 и ид 2.

С едно обединяване на 3 те таблици ( lubimi_uroci, user и uroci)
ще мога да правя всякакви "справки" .

Важно е да забележиш, че в нея се записва всичко с index-и.
 

SayliS

Registered
Предполагам си ми помогнал с това, което си написал и ще го прочета след училище.... 8) все пак ето ти структората

админ.сял
Код:
$admin = "CREATE TABLE admin (
		  id int(11) NOT NULL auto_increment,
		  username varchar(50) NOT NULL,
		  password varchar(255) NOT NULL,
		  first_name varchar(255) NOT NULL,
		  last_name varchar(255) NOT NULL,
		  email varchar(50) NOT NULL,
		  admin_level int(2) NOT NULL,
		  last_join timestamp NOT NULL,
		  add_date timestamp NOT NULL,
		  ip varchar(255) NOT NULL DEFAULT '127.0.0.1',
		  add_from varchar(255) NOT NULL DEFAULT 'PERM',
		  PRIMARY KEY (id))";

статус.сял
Код:
$status = "CREATE TABLE status (
		  id_status int(11) NOT NULL auto_increment,
		  adm_status varchar(50) NOT NULL,		  
		  PRIMARY KEY (id_status))";


За сега 'статус' е малка, но в последствие ще се разрастне. Идеята в момента ми е когато вадя данните от 'админ' вместо на admin_level да ми пише 1/2 да ми вади имената от 'статус' където 'id_status' съответства на 'admin_level' .

Благодаря много за помоща Admin.
 

Admin

Registered
Кода който си ми дал трябва да се промени на това...



$query = "SELECT * FROM admin,status where status.id_status=admin.admin_level
ORDER By admin.username";
$result = mysql_query($query) or die (mysql_error());
?>

<table width="55%" border="1" cellpadding="2" cellspacing="2" align="center">
<tr>
<th>Потребител</th>
<th>Име</th>
<th>Статус</th>
<th>Обнови</th>
<th>Изтрий</th>
</tr>
<?php
$users = "";
while ($row = mysql_fetch_array($result)) {
$u_name = $row['username'];
$f_name = $row['first_name'];
$l_name = $row['last_name'];
$a_level = $row['id_status'];
$r_id = $row['id'];


и виж дали всичко е наред.

Няма как да тествам и може да съм объркал нещо.
 

SayliS

Registered
admin каза:
Кода който си ми дал трябва да се промени на това...



$query = "SELECT * FROM admin,status where status.id_status=admin.admin_level
ORDER By admin.username";
$result = mysql_query($query) or die (mysql_error());
?>

<table width="55%" border="1" cellpadding="2" cellspacing="2" align="center">
<tr>
<th>Потребител</th>
<th>Име</th>
<th>Статус</th>
<th>Обнови</th>
<th>Изтрий</th>
</tr>
<?php
$users = "";
while ($row = mysql_fetch_array($result)) {
$u_name = $row['username'];
$f_name = $row['first_name'];
$l_name = $row['last_name'];
$a_level = $row['adm_status']; // Нетрябва да е $a_level = $row['id_status'];
$r_id = $row['id'];


и виж дали всичко е наред.

Няма как да тествам и може да съм объркал нещо.

Мерси много. Работи като пушка :p
 

Admin

Registered
Пак съм объркал нещо май.
Гледам някакви червени букви като на диктовка. :)

Не знам защо суъм сложил Id_status шам.
Нещо съм се бъгнал явно.
Хубаво, че си се сетил.
 

Горе