Взимане на информация от 2 таблици - проблем

mitaka961

Registered
Здравейте, правя система за мачове и имам един въпрос. Системата се състои от 2 таблици. Първата е teams (в нея има полета team_id , team_logo, team_name) . Втората е matches ( в нея имам (id, match_date, team_1 и team_2).

Мачовете се добавят по следния начин
462884779ae1a5e9.PNG


Ето и снимка от phpmyadmin:

Структура на таблицата matches:
c68fadde7bd69b94.PNG


Структура на таблицата teams:

39bd6efd57cb7957.PNG


И така сега, въпросът ми се състой в това как ще стане извеждането на мачовете. Както видяхте отборите са направени като категории. Но при извеждането трябва да се изведе team_id , team_logo, team_name от таблицата teams и за двата отбора. Също така трябва да се изведе (id, match_date, team_1 и team_2) от таблицата matches.

Всичко това трябва да стане в един код за да може след като се изведа всичко да изглежда така:

9df886187c42f216.PNG
 
Някой може ли да ми го обясни по-точно в самата тема със код? Все още съм начинаещ в PHP
 
PHP:
$row=("SELECT * FROM `matches`,`teams` WHERE `matches`.`team_1`=`teams`.`team_id` AND `matches`.`team_2`=`teams`.`team_id`");

while($fin=mysql_fetch_assoc($row)){
echo $fin['team_name']." - <img src='".$fin['team_logo']."' width=".$fin['width']." height=".$fin['height']." /> <br /> id: ".$fin['id']." - ".$fin['match_date']." time:".$fin['match_time']." rezultat:".$fin['match_result']."<br /><br />";
}
 
Тествах го но ми дава:

Код:
[phpBB Debug] PHP Warning: in file /home/public_html/includes/rightmenu.php on line 7: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
 
Забравил съм да сложа mysql_query();

Също така и връзката към базата данни - да ти напомня, да е имаш.

PHP:
$row=mysql_query("SELECT * FROM `matches`,`teams` WHERE `matches`.`team_1`=`teams`.`team_id` AND `matches`.`team_2`=`teams`.`team_id`");

while($fin=mysql_fetch_assoc($row)){
echo $fin['team_name']." - <img src='".$fin['team_logo']."' width=".$fin['width']." height=".$fin['height']." /> <br /> id: ".$fin['id']." - ".$fin['match_date']." time:".$fin['match_time']." rezultat:".$fin['match_result']."<br /><br />";
}
 
Вместо AND в заявката трябва да е OR. Тоест ето така:

Сложил съм ти и един ORDER BY за да ти излизат последните мачове.

Код:
SELECT * FROM `matches`,`teams` WHERE `matches`.`team_1`=`teams`.`team_id` OR `matches`.`team_2`=`teams`.`team_id` ORDER BY `matches`.`id` DESC


А ето и целия код:

PHP:
$row=mysql_query("SELECT * FROM `matches`,`teams` WHERE `matches`.`team_1`=`teams`.`team_id` OR `matches`.`team_2`=`teams`.`team_id` ORDER BY `matches`.`id` DESC");

while($fin=mysql_fetch_assoc($row)){
echo $fin['team_name']." - <img src='".$fin['team_logo']."' width=".$fin['width']." height=".$fin['height']." /> <br /> id: ".$fin['id']." - ".$fin['match_date']." time:".$fin['match_time']." rezultat:".$fin['match_result']."<br /><br />";
}
 
Не си ме разбрал, аз искам да е LIMIT 1 и да ми излизат и 2 та отбора съответно (team_1 домакина) и (team_2 госта) а то сега като дам LIMIT 1 ми излиза само 1 лого. Там където трябва да се изведат е една таблица ето така:

Код:
<table border="0" bordercolor="#111111" cellpadding="0" cellspacing="0" width="92%"><tbody><tr>
	<td align="left" width="20%"><img src="($team_1) ТУК ТРЯБВА ДА БЪДЕ ПЪРВИЯ ОТБОР *ПРИМЕРНО ЦСКА" alt=""   border="0" title="$team_1" class="dvtip"></td>
	<td align="center" width="40%"><font size="1">match_date<br>$match_time</font><br><b>$match_result</b></td>
	<td align="right" width="20%"><img src="($team_2) ТУК ТРЯБВА ДА БЪДЕ ВТОРИЯ ОТБОР *ПРИМЕРНО ЛИТЕКС" alt=""   border="0" title="$team_1" class="dvtip"></td>
	</tr></tbody></table>

Ето така трябва да стане и да има LIMIT 1 и да се изведат имената на първия и втория отбор. Трябва от един мач да се изкара TEAM_1 и TEAM_2 а не от 2 различни мача по 1 отбор.
 
Аами, всъщност заявката въобще не трябва да е така.

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



PHP:
$row=mysql_query("

SELECT *, b.team_id, a.team_id, 

group_concat(b.team_name,',', a.team_name

			,'/',b.team_logo,',', a.team_logo
			
			,'/',b.height,',', a.height
			
			,'/',b.width,',', a.width
) 

as allteams

FROM matches 

JOIN teams a ON
a.team_id=matches.team_1 

JOIN teams b ON 
b.team_id=matches.team_2

GROUP BY matches.id DESC LIMIT 1

");

$fin=mysql_fetch_assoc($row);

$teamsex=explode("/",$fin['allteams']);

$teamname=explode(",", $teamsex[0]);
$teamname1=$teamname[0];
$teamname2=$teamname[1];

$teamlogo=explode(",", $teamsex[1]);
$teamlogo1=$teamlogo[0];
$teamlogo2=$teamlogo[1];

$teamheight=explode(",", $teamsex[2]);
$teamh1=$teamheight[0];
$teamh2=$teamheight[1];

$teamwidth=explode(",", $teamsex[3]);
$teamw1=$teamwidth[0];
$teamw2=$teamwidth[1];

echo '

TEAM EDNO:'.$teamname1.'<br />
TEAM DVE:'.$teamname2.'<br />

	 <table border="0" bordercolor="#111111" cellpadding="0" cellspacing="0" width="92%"><tbody><tr>
   <td align="left" width="20%"><img src="'.$teamlogo1.'" alt=""  width="'.$teamw1.'" height="'.$teamh1.'"   border="0" title="'.$teamname1.'" class="dvtip"></td>
   
   
   <td align="center" width="40%"><font size="1">match_date<br>'.$fin['match_time'].'</font><br><b>'.$fin['match_result'].'</b></td>
     
   <td align="right" width="20%"><img src="'.$teamlogo2.'" alt="" width="'.$teamw2.'" height="'.$teamh2.'"  border="0" title="'.$teamname2.'" class="dvtip"></td>
   
   </tr></tbody></table>

';
 
@eddyy93 става и с доста по кратък код, единствения минус е, че заявките са не 1 а, 3 и не знам дали вариянта е много добър, но работи :)

PHP:
<?php 
	$our = mysql_query("SELECT * FROM matches WHERE match_cat = 1 ORDER BY match_id DESC") or die (mysql_error());
	$row = mysql_fetch_assoc($our);
		$our1 = mysql_query("SELECT * FROM teams WHERE $row[team1] = team_id") or die (mysql_error());
		$our2 = mysql_query("SELECT * FROM teams WHERE $row[team2] = team_id") or die (mysql_error());
			$row = mysql_fetch_assoc($our1);
			echo "<img src='$row[team_logo]' width='$row[logo_width]' height='$row[logo_height]'/>$row[team_name]";
			$row = mysql_fetch_assoc($our2);
			echo "<img src='$row[team_logo]' width='$row[logo_width]' height='$row[logo_height]'/>$row[team_name]";
?>
Опитах се да сабера в едно заявките our1, our2, но нещо се бъгва кода и не знам защо и реших така да го направя :)
Сега го тествах и сработи :)
 
Целта е да е с една заявка (автора така иска).

Попрнцип според мен по-оптимизиран вариянт ще е ако е с два заявки, така няма да включваме "group_concat", тъй като някъде бях прочел, че това не е функция която е много оптимизирана.

Но да тества, по кой начин кода се бави повече.

С две заявки ще стане:

[sql]
$team1=SELECT * FROM matches, teams WHERE matches.team_1=teams.team_id ORDER BY matches.id DESC LIMIT 1

$team2=SELECT * FROM matches, teams WHERE matches.team_2=teams.team_id ORDER BY matches.id DESC LIMIT 1
[/sql]

@kikity_94 Ако се опитаваш да събереш с един AND в where клаузите, няма да ти се получи правилен резултат, тъй като няма да селектираш и 2 те наименование на отборите, за да стане всичко в една заявка, според мен това е заявката която написах в миналия ми пост (точно преди поста на "kikity_94"), ако греша - нека някой ме поправи.
 
edy аз не видях авторът да иска да е с 1 зявка и не мисля, че така кодът ще емного бавен, вече друг е въпросът ако има много записи и почне да бави, но тогава ще се мисли за оптимизиране. Аз съм сигурен, че някоя умна главица може да го измисли с една с заявка и някой по малък код, но знанията ми не са чак на такова високо ниво по mysql
 
Пиша този пост, защото ме малко яд на автора, че изобщо не оценява това, че се опитвам да му направя малко по - оптимизирана заявката, а не да му плясна 1000 заявки за нищо.

Варянта на kikity94 със 3 заявки, на нещо което може да стане с 2 заявки, дори с една заявка както съм дал в примера и автора да избере варянта в който си усложнява работата на базата данни. Просто :shock:
Или пък иска да му е по-малко кода, по някой път по-малкото код не означава по - бърз код.

Примерно ти влизат 100 потребитела, ти трябва да заредиш 300 заявки за да покажеш на потребителите информацията. Все пак 100х3 заявки = 300.

Аз ти дадох вариянт с една заявка 100x1 = 100 заявки. Сега ми дойде на акъла ако не ти работи горният ми пример с едната заявка, то проблема ще ти идва от базата данни, пред JOIN трябва да сложиш INNER, трябва да стане INNER JOIN и ще ти работи.


----

Дори сега ще ти дам с 2 заявки, отново по - оптимизиран вариянт от на kikity. Щом държиш да е с повече заявки.



PHP:
$row1=mysql_query("SELECT * FROM matches, teams WHERE matches.team_1=teams.team_id ORDER BY matches.id");
$row2=mysql_query("SELECT * FROM matches, teams WHERE matches.team_2=teams.team_id ORDER BY matches.id");

$fin1=mysql_fetch_assoc($row1);
$fin2=mysql_fetch_assoc($row2);
echo 'TEAM EDNO:'.$fin1['team_name'].'<br />
TEAM DVE:'.$fin2['team_name'].'<br />
	 <table border="0" bordercolor="#111111" cellpadding="0" cellspacing="0" width="92%"><tbody><tr>
   <td align="left" width="20%"><img src="'.$fin1['team_logo'].'" alt=""  width="'.$fin1['width'].'" height="'.$fin1['height'].'"   border="0" title="'.$fin1['team_name'].'" class="dvtip"></td>
   <td align="center" width="40%"><font size="1">match_date<br>'.$fin['match_time'].'</font><br><b>'.$fin['match_result'].'</b></td>
   <td align="right" width="20%"><img src="'.$fin2['team_logo'].'" alt="" width="'.$fin2['width'].'" height="'.$fin2['height'].'"  border="0" title="'.$fin2['team_name'].'" class="dvtip"></td>
   </tr></tbody></table>
';
 
edy има и нещо друго обаче. Аз използвам 3 заявки с друга цел тъй като този код който аз и ти дадохме е за извеждане на Следващ мач на конкретния отбор а в БД има поле което записва дали мача е следващ или предишен. Погледни where клаузата на първата заявка (match_cat = 1) и ще разбереш, че от там нататък кода трябва да извежда мачове които са обозначени като следващ. Правя го с тази цел защото не съм сигурен, че с AND i 2те заявки ще сработи както трябва ;)
 
Не съм пробвал, но този код който дадох ми доде първо на ум да направя. Знам, че може да бъде доста по оптимизиран, но щом на автора му е свършил по добра работа от твоя първи код. Не разбрах защо те е яд, защото не ти получи точката или ? Аз не съм дал кода с цел да получа точка ами да помогна, а там вече автора си преценява на кой помоща е била най-добра за него
 
Не ме е яд за точки, не ми трябват. Не съм тука за това (нищо, че ако има повече точки е по-готино, но това е отделен въпрос).

Яд ме е, че автора не се впрегна да разгледа кода който дадох. Ама видя, че твоя е по кратък и "айде той е по-добър", не ти казвам че е лош. Както и да е, просто не оцени това, че бях седнал да му мисля, как структурирана заявката ще е по-добра за него, но все ми е едно, както иска така да си пише кода.

Стига вече спам в тая тема, накрая ще ни блокират от сайта (е поне няма да ме е яд, повече за хорските проблеми) :D
 

Back
Горе