Задавайте вопросы, мы ответим
Вы не зашли.
Есть две таблицы товары и атрибуты товаров
products
pid | name
1 | монитор
attribute
atr_id|pid | price | order | stock_1 | stock_2
1 | 1 | 50 | 1 | 3 | 2
2 | 1 | 10 | 2 | 0 | 0
3 | 1 | 30 | 3 | 0 | 1
Как сделать products JOIN запрос SELECT price, IF( (stock_1+stock_2)>0, 0,1 ) as stock_order FROM attribute ORDER BY stock_order, `order` LIMIT 1 - важен именно это ORDER BY
GROUP BY pid не вариант при этом ORDER BY не работает
SELECT p.*, ( SELECT (@price:= price) and (@stock_order:= IF( (stock_1+stock_2)>0, 0,1 )) as empty FROM attribute a WHERE a.pid=p.pid ORDER BY @stock_order, `order` LIMIT 1 ), @price,@stock_order FROM products p; не вариант не работает ORDER BY @stock_order
LEFT JOIN attribute a ON a.pid = p.pid AND a.atr_id IN ( SELECT price, IF( (stock_1+stock_2)>0, 0,1 ) as stock_order ... ) тоже не вариант т.к. нужно объявить stock_order и LIMIT в подзапросе не работает
У кого будут какие идеи? Может незначительно архитектуру таблиц изменить
Неактивен
..
products p LEFT JOIN
(SELECT a.price, a.pid FROM attribute a JOIN (SELECT atr_id FROM attribute ORDER BY IF( (stock_1+stock_2)>0, 0,1 ), `order` LIMIT 1) t ON a.atr_id=t.atr_id) x
ON p.pid=x.pid
;
и посмотрите эти статьи:
http://sqlinfo.ru/articles/info/18.html
http://sqlinfo.ru/articles/info/19.html
Неактивен
vasya написал:
..
products p LEFT JOIN
(SELECT a.price, a.pid FROM attribute a JOIN (SELECT atr_id FROM attribute ORDER BY IF( (stock_1+stock_2)>0, 0,1 ), `order` LIMIT 1) t ON a.atr_id=t.atr_id) x
ON p.pid=x.pid
;
Упустил один момент это работает только если в таблице products одна запись, по факту их больше. В данном случае в результате выборки одна строка с JOIN как и хотелось а остальные NULL
В общем уточню
products
pid | name
1 | монитор
2 | HDD
attribute
atr_id|pid | price | order | stock_1 | stock_2
1 | 1 | 50 | 1 | 3 | 2
2 | 1 | 10 | 2 | 0 | 0
3 | 1 | 30 | 3 | 0 | 1
4 | 2 | 70 | 1 | 0 | 0
5 | 2 | 90 | 2 | 0 | 1
Как написать запрос что бы был результат?
pid | name | atr_id | price | order | stock_1 | stock_2
1 | монитор| 1 | 50 | 1 | 3 | 2
2 | HDD | 5 | 90 | 2 | 0 | 1
Неактивен
тогда используйте 5-ый способ из статьи про группировку
Неактивен
Может кому буде интересно решил задачу следующим образом, по производительности вроде норм запрос, но это работает если только нужно INNER JOIN
SELECT a.*, (SELECT attr_id from attribute a WHERE Product.pid = a.pid ORDER BY IF( (stock_1+stock_2)>0, 0,1 ) LIMIT 1 ) as join_attr_id FROM products, attribute WHERE Product.pid = attribute.pid HAVING join_attr_id = attribute.attr_id
Неактивен