1

Тема: Як вибрати всі поля з таблиці A по полям таблиці B

Привіт дорогі форумчани. Прошу у Вас допомоги в такій питані... Є дві таблиці
1) items_list - тут знаходиться вся інфа про інвентарь
2) schop - тут є два поля перше id (число по якому ми будем вибирати поля з таблиці items_list ) а друге mani (ціна за цей придмет який ми виберем з таблиці items_list )
Допусти що в таблиці schop є 2 рядка
1) id = 77, mani = 2000
2) id = 55, mani = 3000
мені потрібно щоб на сторінці відображалися dcs рядки з таблиці items_list по id = 77 та id = 55 які знаходяться в таблиці schop. Як таке можна зробити? Я зробив ось що:

echo "<table border=1>";
echo "<tr>";
echo "<td>тип</td>"; 
echo "<td>название</td>"; 
echo "<td>фото</td>"; 
echo "<td>вес</td>"; 
echo "<td>точность</td>"; 
echo "<td>мин урон</td>"; 
echo "<td>мах урон</td>"; 
echo "<td>защита</td>"; 
echo "<td>скорость</td>"; 
echo "<td>цена</td>"; 
echo "<td>&nbsp</td>"; 
echo "</tr>";

$query_schop = "SELECT * FROM schop ";  
$result_schop = mysql_query($query_schop) or die("Query failed : " . mysql_error());  
while($aRow_schop = mysql_fetch_array( $result_schop)) 
{ 
$rez[]=$aRow_schop; 
} 
foreach($rez as $aRow_schop) 
{ 
$aid_schop = $aRow_schop["id"]; 
$amani_schop = $aRow_schop["mani"]; 



$quer_items= "SELECT items_id, Protection, Thespeed, ItemType, ItemNo, ItemName, Item_StateCost, Item_Image, Item_Weight, Item_Accuracy, Item_Level, Min_Damage, Max_Damage FROM items_list where items_id='$aid_schop'"; 
$resul_items = mysql_query($quer_items) or die("Query failed : " . mysql_error()); 

while($aRow_items = mysql_fetch_array( $resul_items)) 
{ 
$rez2[]=$aRow_items; 
} 

foreach($rez2 as $aRow_items) 
{ 
$aitems_id = $aRow_items["items_id"];
$aProtection = $aRow_items["Protection"];
$aThespeed = $aRow_items["Thespeed"];
$aItemType = $aRow_items["ItemType"];
$aItemNo = $aRow_items["ItemNo"]; 
$aItemName = $aRow_items["ItemName"]; 
$aItem_StateCost = $aRow_items["Item_StateCost"]; 
$aItem_Image = $aRow_items["Item_Image"]; 
$aItem_Weight = $aRow_items["Item_Weight"]; 
$aItem_Accuracy = $aRow_items["Item_Accuracy"]; 
$aItem_Level = $aRow_items["Item_Level"];  
$aMin_Damage = $aRow_items["Min_Damage"];  
$aMax_Damage = $aRow_items["Max_Damage"];  



echo "<tr>";
echo "<td>".$aRow_items["ItemType"]."</td>"; 
echo "<td>".$aRow_items["ItemName"]."</td>"; 
echo "<td><img src='images/items/".$aRow_items["Item_Image"]."' style=' height: 30px; width: 30px;'></td>"; 
echo "<td>".$aRow_items["Item_Weight"]."</td>"; 
echo "<td>".$aRow_items["Item_Accuracy"]."</td>"; 
echo "<td>".$aRow_items["Min_Damage"]."</td>"; 
echo "<td>".$aRow_items["Max_Damage"]."</td>"; 
echo "<td>".$aRow_items["Protection"]."</td>"; 
echo "<td>".$aRow_items["Thespeed"]."</td>"; 
echo "<td>".$aRow_schop["mani"]."</td>"; 
echo "<td> купить </td>"; 
echo "</tr>";

}}
echo "</table>";

Але це не працює! Виводить на екарн два однакових поля
http://www.ex.ua/972225641197

2

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Викорстовуйте join в mysql

http://dev.mysql.com/doc/refman/5.0/en/join.html

Подякували: Faraon1

3

Re: Як вибрати всі поля з таблиці A по полям таблиці B

funivan написав:

Викорстовуйте join в mysql

http://dev.mysql.com/doc/refman/5.0/en/join.html

Щось не виходить...
Відображається тільки один предмет id якого записане в першому рядку таблиці schop
код:

if (isset($_GET["pers"]))
 { 
echo "<br><table border=1>";
echo "<tr>";
echo "<td>тип</td>"; 
echo "<td>название</td>"; 
echo "<td>фото</td>"; 
echo "<td>вес</td>"; 
echo "<td>точность</td>"; 
echo "<td>мин урон</td>"; 
echo "<td>мах урон</td>"; 
echo "<td>защита</td>"; 
echo "<td>скорость</td>"; 
echo "<td>цена</td>"; 
echo "<td>&nbsp</td>"; 
echo "</tr>";

$query_schop = "SELECT * FROM schop s inner join items_list il on il.items_id=s.id";  
$result_schop = mysql_query($query_schop) or die("Query failed : " . mysql_error());  
while($aRow_items = mysql_fetch_array( $result_schop)) 
{ 
$rez_items[]=$aRow_items; 
} 
foreach($rez_items as $aRow_items) 
{ 
$aitems_id = $aRow_items["items_id"];
$aProtection = $aRow_items["Protection"];
$aThespeed = $aRow_items["Thespeed"];
$aItemType = $aRow_items["ItemType"];
$aItemNo = $aRow_items["ItemNo"]; 
$aItemName = $aRow_items["ItemName"]; 
$aItem_StateCost = $aRow_items["Item_StateCost"]; 
$aItem_Image = $aRow_items["Item_Image"]; 
$aItem_Weight = $aRow_items["Item_Weight"]; 
$aItem_Accuracy = $aRow_items["Item_Accuracy"]; 
$aItem_Level = $aRow_items["Item_Level"];  
$aMin_Damage = $aRow_items["Min_Damage"];  
$aMax_Damage = $aRow_items["Max_Damage"];  



echo "<tr>";
echo "<td>".$aRow_items["ItemType"]."</td>"; 
echo "<td>".$aRow_items["ItemName"]."</td>"; 
echo "<td><img src='../images/items/".$aRow_items["Item_Image"]."' style=' height: 30px; width: 30px;'></td>"; 
echo "<td>".$aRow_items["Item_Weight"]."</td>"; 
echo "<td>".$aRow_items["Item_Accuracy"]."</td>"; 
echo "<td>".$aRow_items["Min_Damage"]."</td>"; 
echo "<td>".$aRow_items["Max_Damage"]."</td>"; 
echo "<td>".$aRow_items["Protection"]."</td>"; 
echo "<td>".$aRow_items["Thespeed"]."</td>"; 
echo "<td>".$aRow_items["mani"]."</td>"; 
echo "<td> купить </td>"; 
echo "</tr>";

}
echo "<tr>";
echo "<td colspan=11><a href='mapa.php?loc=2'><== уйти</a></td>"; 
echo "</tr>";
echo "</table>";
}

4

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Хоч натякніть де моя помилка. )))

5

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Покажіть результат запитів з бази:

select * from items_list

select * from schop

Хочу повну структуру побачити.

Тільки скріни якось так давайте - у мене ехуа недоступний, наприклад.

З.І: А взагалі, якщо ви явно знаєте schop.Id, за яким треба фільтрувати дані з items_list, можете спробувати легший запит:

select * from items_list where schopId IN (17, 55);

6 Востаннє редагувалося Faraon (28.02.2014 20:18:14)

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Покажіть результат запитів з бази:

select * from items_list

select * from schop

Хочу повну структуру побачити.

м... я хіба цей запит не означає що ми вибираємо всі дані з двох таблиць?

$query_schop = "SELECT * FROM schop s inner join items_list il on il.items_id=s.id";  

З.І: А взагалі, якщо ви явно знаєте schop.Id, за яким треба фільтрувати дані з items_list, можете спробувати легший запит:

Справа в тому що дані за якими потрібно буде фільтрувати будуть змінюватися додаватися/видалятися. Ось я і вирішив їх зберігати в базі.

7

Re: Як вибрати всі поля з таблиці A по полям таблиці B

м... я хіба цей рядок не означає що ви вибираємо всі дані з двох таблиць?

Я структуру таблиць у читабельному вигляді хочу побачити.
Звісно, правильніше було би

describe items_list;
describe schop;

Бо ж у вас мускул.

Справа в тому що дані за якими потрібно буде фільтрувати будуть змінюватися додаватися/видалятися. Ось я і вирішив їх зберігати в базі.

Зауваження стосувалося не цього, а структури самого запиту. У тому сенсі, що, якщо у вас айдішники, по яких іде фільтр у WHERE, відомі ззовні (скажімо, до того ви десь їх із форми витягли, абощо), то JOIN може бути не обов'язковим і буде достатньо WHERE.

8 Востаннє редагувалося Faraon (28.02.2014 20:40:38)

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Пробачте Bartash, але я вас погано розумію) (це через мої погані знання, тому пробачте якщо дратую питаннями)

Я структуру таблиць у читабельному вигляді хочу побачити.

так?:

CREATE TABLE `schop` (
  `id` int(11) default NULL, // ід за яким буде відбаватися фільтруватися дані
  `mani` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


CREATE TABLE `items_list` (
  `items_id` int(4) unsigned NOT NULL auto_increment,
  `ItemType` varchar(50) default '0',
  `ItemNo` varchar(50) default '1',
  `ItemName` varchar(50) NOT NULL,
  `Item_StateCost` int(11) default '0',
  `Item_Image` varchar(100) default NULL,
  `Item_Weight` int(11) default '1',
  `Item_Accuracy` int(11) default '0',
  `Item_Level` int(11) default '0',
  `Min_Damage` int(11) default '0',
  `Max_Damage` int(11) default '0',
  `Protection` int(11) default '0',
  `Thespeed` int(11) default '0',
  PRIMARY KEY  (`items_id`),
  KEY `ItemType` (`ItemType`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Зауваження стосувалося не цього, а структури самого запиту. У тому сенсі, що, якщо у вас айдішники, по яких іде фільтр у WHERE, відомі ззовні (скажімо, до того ви десь їх із форми витягли, абощо), то JOIN може бути не обов'язковим і буде достатньо WHERE.

а... ні, зовні вони не відомі. Звичайно, що можна спочатку зробити окремий вибір через select для кожного id яке буди приймати участь у фільтрувані а потім просто скористатися WHERE, але я думав що можна зробити по іншому, кращому способі.

9

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Та, дяку - тепер ліпше. :)

Однак я не дуже розумію, як мають ці таблиці поєднуватися. Якщо слідувати вашим коментам, то зв'язок має бути "один до багатьох". А яка з таблиць при цьому первинна буде? (тобто у якої таблиці одному рядку може відповідати купа рядків іншої?)

10

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Дивіться, в таблиці schop є поле id в якому записано номер строки поля яке в таблиці items_list  (під назвою items_id) цей рядок потрібно вивести наекран! Цих id може бути багато і їз всіх потрібно вивести!

11

Re: Як вибрати всі поля з таблиці A по полям таблиці B

1. Введіть якесь поле у таблиці schop, що забезпечить унікальність рядка таблиці. Чи це тут не грає ролі?

2. Що зараз міститься у таблицях? Покажіть результати селектів з них.

12 Востаннє редагувалося Faraon (28.02.2014 23:15:41)

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Bartash написав:

1. Введіть якесь поле у таблиці schop, що забезпечить унікальність рядка таблиці. Чи це тут не грає ролі?

2. Що зараз міститься у таблицях? Покажіть результати селектів з них.

1) це поле називається id, воно забеспечує унікальність рядка таблиці items_list
2) допустим що структура та вміст таблиць зараз такий:
schop:
| id | mani |
| 2  | 2000 |
| 6  | 1000 |
items_list:
| items_id | ItemName |
|     1       |  name 1     |
|     2       |  name 2     |
|     3       |  name 3     |
|     4       |  name 4     |
|     5       |  name 5     |
|     6       |  name 6     |
|     7       |  name 7     |
|     8       |  name 8     |
|     9       |  name 9     |
|     10     |  name 10    |
на екран має виводити рядки з таблиці items_list 2 та 6 тому на екрані має бути наступне:
name 2
name 6
Розумієте що саме я намагаюся зробити?! )

13

Re: Як вибрати всі поля з таблиці A по полям таблиці B

на екран має виводити рядки з таблиці items_list 2 та 6 тому на екрані має бути наступне:
name 2
name 6
Розумієте що саме я намагаюся зробити?! )

Не дуже.

1. Скажімо, до наведеного додаю:

insert into schop (id, mani) values (2, 2000);

І у таблиці порушено унікальність.
2.

select il.ItemName, s.Mani FROM Schop s LEFT JOIN Item_List il ON s.Id = il.Items_id

Спробуйте так.

14

Re: Як вибрати всі поля з таблиці A по полям таблиці B

Bartash написав:

на екран має виводити рядки з таблиці items_list 2 та 6 тому на екрані має бути наступне:
name 2
name 6
Розумієте що саме я намагаюся зробити?! )

Не дуже.

1. Скажімо, до наведеного додаю:

insert into schop (id, mani) values (2, 2000);

І у таблиці порушено унікальність.
2.

select il.ItemName, s.Mani FROM Schop s LEFT JOIN Item_List il ON s.Id = il.Items_id

Спробуйте так.

Так, все вийшло. Дуже Вам дякую за допомогу.