Сложный запрос MySQL

sanu0074

Новичок
Как в одном запросе извлечь данные о неких элементах в таблице, и попутно с других таблиц прицепить к ним строки соответствующие по идентификатору. Суть на примере:
Я извлекаю данные о товарах:
PHP:
        $q = $dbh->prepare("select * from products where section=?");
        $q->execute(array('fruits'));
        $res = $q->fethAll();
Но для того чтобы извлечь для каждого товара доп. данные с других таблиц, мне приходится массив $res перебирать циклом и делать много запросов к ост таблицам:
PHP:
        $q = $dbh->prepare("select * from comments where id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['comments'] = $q->fethAll();
       
        $q = $dbh->prepare("select * from likes where id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['likes'] = $q->fethAll();
// .... и т.д.
Как это чётенько и компактно, по возможности максимум снизив нагрузку на сервер, сделать в одном запросе?
 

lart

Guest
Тут вопрос какие связи между таблицами, если один к одному, то через WHERE или LEFT JOIN, а если один ко многим, то количество продуктов будет равно количеству, например, комментариев.
 

Фанат

oncle terrible
Команда форума
Зачем тебе получать все комментарии ко всем продуктам?
 

sanu0074

Новичок
Код:
SELECT `products`.*, `comments`.*, `likes`.* FROM `products`
LEFT JOIN `comments`
    ON( `comments`.`id`=`products`.`id` )
LEFT JOIN `likes`
    ON( `likes`.`id`=`products`.`id` )
WHERE `products`.`section`=?
Еще как-то более компактнее можно сделать?
 

Фанат

oncle terrible
Команда форума
Не надо бессмысленный пример.
Хочешь осмысленный ответ - задай осмысленный вопрос.
 

sanu0074

Новичок
А если вариант, в котором comments и likes будут в таблице products, просто поле section у них будет = comments и likes соответственно, т.е. чтоб их извлечь нужно выполнить запрос:
Код:
select from products where section=likes //....
Получается нужно делать так:
Код:
$q = $dbh->prepare("select * from products where section=comments AND product_id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['comments'] = $q->fethAll();
      
        $q = $dbh->prepare("select * from products where section=likes AND product_id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['likes'] = $q->fethAll();
пример тупой, понимаю, но допустим такая ситуация, то как сделать все в одном сложном запросе?
нужно делать JOIN той же таблицы (работать будет)? это правильно?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Да, будет работать. А правильно или нет - не всё ли равно, если результат тебя устраивает?
 
Сверху