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

12
Sanu0074
На сайте с 31.08.2012
Offline
110
949

Как в одном запросе извлечь данные о неких элементах в таблице, и попутно с других таблиц прицепить к ним строки соответствующие по идентификатору. Суть на примере:

Я извлекаю данные о товарах:

        $q = $dbh->prepare("select * from products where section=?");

$q->execute(array('fruits'));
$res = $q->fethAll();

Но для того чтобы извлечь для каждого товара доп. данные с других таблиц, мне приходится массив $res перебирать циклом и делать много запросов к ост таблицам:

        $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();
// .... и т.д.

Как это чётенько и компактно, по возможности максимум снизив нагрузку на сервер, сделать в одном запросе?

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
dimsog
На сайте с 08.08.2011
Offline
149
#2

SELECT * FROM `comments` c 

INNER JOIN `likes` l ON c.id=l.id
WHERE c.id=?

Вообще это делается с помощью JOIN. Инструкция элементарная, разобраться 5 минут времени.

ihor vps -> ihc.ru
Sanu0074
На сайте с 31.08.2012
Offline
110
#3

dimsog, а можно ли сделать такой запрос чтоб обойтись без перебора циклом записей из products?

sidorka
На сайте с 17.08.2012
Offline
211
#4

Sanu0074, глянь мою старую тему - /ru/forum/821551

Мож поможет

Дешевые домены для дорвеев и не только - от 55р (https://goo.gl/Wtnwqp)
Sanu0074
На сайте с 31.08.2012
Offline
110
#5

А если вариант, в котором 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 той же таблицы (работать будет)? это правильно?

siv1987
На сайте с 02.04.2009
Offline
427
#6

section IN ('likes', 'comments') что аналогично OR

dimsog
На сайте с 08.08.2011
Offline
149
#7
Sanu0074:
dimsog, а можно ли сделать такой запрос чтоб обойтись без перебора циклом записей из products?

Я же показал объединение таблиц, там можно сделать любое условие выборки и никаких циклов не нужно.

Sanu0074
На сайте с 31.08.2012
Offline
110
#8

dimsog, да, я именно этим воспользовался, просто спрашиваю о том, несколько join'ов в запросе в плане производительности это не критично?

dimsog
На сайте с 08.08.2011
Offline
149
#9

Это намного лучше, чем перебирать массив циклом, а также быстрее в разы. Главное, чтобы ключи были проставлены. Главное, не добавлять сортировку ORDER BY, так как работать будет медленнее.

Sanu0074
На сайте с 31.08.2012
Offline
110
#10

dimsog, насчет ключей, например id - primary, а prod_id если есть (внешний ключ), то - index ?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий