Есть товары, и есть таблица с картинками. У одного товара может быть сколько угодно картинок.
Сейчас я реализую вот так:
$result = mysql_query("select * from catalog");
while($row = mysql_fetch_array($result)){
$id = $row['id']; //получили текущий ID
$resultP = mysql_query("select * from pics where id_product = $id");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}
}
Говорят, правильней сделать одним запросом, а не насиловать сервер.
Спустя 4 минуты, 22 секунды (26.04.2011 - 11:38) alex12060 написал(а):
Вложенный запрос. Или JOIN
Спустя 2 минуты, 2 секунды (26.04.2011 - 11:40) Nikitian написал(а):
Лучше в 2 запроса:
Хотя если кроме самих картинок никаких данных не требуется, то можно и так:
$result = mysql_query("select * from catalog");
$ids=array();
while($row = mysql_fetch_array($result)){
$id = $row['id']; //получили текущий ID
$ids[]=$id;
}
$resultP = mysql_query("select * from pics where id_product in ('".implode('","',$id)."')");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}
Хотя если кроме самих картинок никаких данных не требуется, то можно и так:
$resultP = mysql_query("select * from pics where id_product in (select id from catalog)");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}
Спустя 8 секунд (26.04.2011 - 11:41) Игорь_Vasinsky написал(а):
действительно - 100 строк - 100 запросов....
могу посоветовать переделать таблицу:
могу посоветовать переделать таблицу:
table `catalog`
id | goods
// id и название товара
table `pics`
id | nameFile | goods_id
//id , имя картинки (может и вместе с путём), id - товара к которому пренадлежит картинка
Спустя 10 минут, 12 секунд (26.04.2011 - 11:51) linker написал(а):
Судя по примеру, здесь имхо единственно верный вариант
SELECT * FROM `pics` ORDER BY `id_product` ASC:D
Спустя 2 минуты, 22 секунды (26.04.2011 - 11:53) Nikitian написал(а):
Цитата (linker @ 26.04.2011 - 11:51) |
Судя по примеру, здесь имхо единственно верный вариант SELECT * FROM `pics` ORDER BY `id_product` ASC:D |
Не факт, что в пиксах только из каталога картинки описаны. Я часто делаю общую таблицу под все загружаемые файлы, независимо от их принадлежности к какому-либо модулю.
Спустя 9 минут, 1 секунда (26.04.2011 - 12:02) maximka787 написал(а):
alex12060
ну да, это верно, только я не делал пока так)
ну да, это верно, только я не делал пока так)
Цитата |
могу посоветовать переделать таблицу: |
не тут однозначно структура верная. К тому же ты тоже самое и написал если я не ошибаюсь.
Nikitian Да мне надо выводить данные из 2х таблиц, не только картинки. Первый вариант наворочен на мой взгляд но суть думаю верная.
Nikitian Да мне надо выводить данные из 2х таблиц, не только картинки. Первый вариант наворочен на мой взгляд но суть думаю верная.
Спустя 4 минуты, 56 секунд (26.04.2011 - 12:07) linker написал(а):
Ну я не зря улыбался

Спустя 11 минут, 24 секунды (26.04.2011 - 12:18) Nikitian написал(а):
Если уж совсем в педагогику удариться. то так
$result = mysql_query("select * from catalog");
$data=array();
if(is_resource($result) && mysql_num_rows($result)>0){
while($row = mysql_fetch_assoc($result)){
$data[mysql_escape_string($id)]=$row;
}
}
if(sizeof($data)>0){
$result = mysql_query("select `link`,`id_product` from pics where id_product in ('".implode('","',array_keys($data)."')");
if(is_resource($result) && mysql_num_rows($result)>0){
while($row = mysql_fetch_assoc($result)){
$data[$rowP['id_product']]['pics'][]=$row['link'];
}
}
}
//Вывод
if(sizeof($data)>0){
foreach($data as $item){
//Здесь выводим данные о товаре из $item
.....
if(is_array($item['pics']) && sizeof($item['pics'])>0){
foreach($item['pics'] as $pic){
echo '<p><img src="'.$pic.'"></p>';
}
}
}
}
Спустя 2 минуты, 51 секунда (26.04.2011 - 12:21) maximka787 написал(а):
linker
почему, глупая структура?
id_product и id из первой таблицы связь
почему, глупая структура?
id, name .....; //товары
id, id_product, link // таблица картинок
id_product и id из первой таблицы связь
Спустя 9 минут, 19 секунд (26.04.2011 - 12:31) linker написал(а):
Я бы пошёл старым дедовским способом (раз нет дополнительных условий)
maximka787
Да я не про то.
$query = "SELECT `catalog`.`*`, `pics`.`link` FROM `catalog` "
. "LEFT JOIN `pics` ON `pics`.`product_id` = `catalog`.`id` ";
$last_product = -1;
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
if ($last_product != $row['id'])
{
$last_product = $row['id'];
echo "Каталог : " . $row['name'];
}
echo '<p><img src="'.$rowP['link'].'"></p>';
}
maximka787
Да я не про то.
Спустя 3 минуты, 29 секунд (26.04.2011 - 12:34) maximka787 написал(а):
Спасибо всем, попробую.
Спустя 3 часа, 18 минут, 39 секунд (26.04.2011 - 15:53) inpost написал(а):
maximka787
SELECT b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
GROUP BY a.`id`
SELECT b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
GROUP BY a.`id`
Спустя 18 минут, 59 секунд (26.04.2011 - 16:12) Nikitian написал(а):
Цитата (inpost @ 26.04.2011 - 15:53) |
maximka787 SELECT b.* FROM catalog a LEFT JOIN pics b ON b.id_product = a.id GROUP BY a.`id` |
Не проканает:
Цитата |
У одного товара может быть сколько угодно картинок |
Спустя 17 минут, 48 секунд (26.04.2011 - 16:30) inpost написал(а):
Nikitian
Подправил
maximka787
Получишь список типо: продукт 1-картинка1, продукт-1-картинка-2, в условии добавишь проверку, что если a.id повторилась, то картинка для этого продукта, если нет - то уже для следующего, где id продукта = a.id
Подправил
maximka787
SELECT a.`id` as `a.id`,b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
ORDER BY `id`
Получишь список типо: продукт 1-картинка1, продукт-1-картинка-2, в условии добавишь проверку, что если a.id повторилась, то картинка для этого продукта, если нет - то уже для следующего, где id продукта = a.id
_____________
..Работает - не трогай!