Как за один запрос объединить 3 таблицы с лимитом?
Есть 3 таблицы:
Goods: id, name
Prices: pid, price
Images: pid, filename, order
Для одного товара может быть несколько цен и картинок.
Нужно выбрать за один SQL-запрос все товары, к которым должна быть добавлена минимальная цена и картинка с order=0
Не растет кокос уже два дня :-(
Выбрать одну картинку получается так:
SELECT `g`.*, `i`.`filename` FROM `goods` AS `g` LEFT JOIN `images` AS `i` ON `i`.`id` = ( SELECT `i1`.`id` FROM `images` AS `i1` WHERE `g`.`id` = `i1`.`pid` ORDER BY `i1`.`order` LIMIT 1) WHERE 1
(добавил id в таблицу Images)
А если по такому же принципу еще добавляю цену - не работает запрос.
SELECT `g`.*, `i`.`filename`,`p`.`price` FROM
(`goods` AS `g` LEFT JOIN `images` AS `i` ON `i`.`pid` = `g`.`id` and `i`.`order`=0)
left join
`prices` as `p` on `p`.`id`=(SELECT `p1`.`id` FROM `prices` AS `p1` WHERE `g`.`id`=`p1`.`pid` ORDER BY `p1`.`price` LIMIT 1)
SELECT g.*,
i.filename,
MIN(p.price)
FROM goods AS g
LEFT JOIN images AS i ON i.pid = g.id AND i.order=0
INNER JOIN prices AS p ON p.pid = g.id
GROUP BY g.id;
может быть такое, что у товара нет изображения? если нет, то left join надо заменить на inner join
Добавил табличку с ценой - заработало. Видимо, до этого делал какие-то опечатки несколько раз подряд.
Теперь новый вопрос - насколько эффективен такой запрос? На 10 тыс. товаров, 15 тыс. картинок и 20 тыс. цен выполняется за 0,1579 сек.
Одиночка Айс, дык сперва надо количество записей узнать, чтоб постранично разбить, а потом уже лимиты.
нормально на 150 тысячах товаров работает, главное, индексы правильные сделать =)