SQLinfo.ru - Все о MySQL Highload++ 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.02.2017 01:00:03

Warrior1
Участник
Зарегистрирован: 09.02.2017
Сообщений: 3

Помогите Join только одной строки

Есть две таблицы товары и атрибуты товаров

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 в подзапросе не работает


У кого будут какие идеи?  Может незначительно архитектуру таблиц изменить

Неактивен

 

#2 10.02.2017 04:28:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Помогите Join только одной строки

..
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

Неактивен

 

#3 10.02.2017 23:30:43

Warrior1
Участник
Зарегистрирован: 09.02.2017
Сообщений: 3

Re: Помогите Join только одной строки

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

Неактивен

 

#4 11.02.2017 01:43:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Помогите Join только одной строки

тогда используйте 5-ый способ из статьи про группировку

MariaDB [test]> select pid, atr_id, price, `order`, stock_1, stock_2 from (selec
t *, if (@u=pid, @i:=@i+1,(@i:=0) or (@u:=pid) or 1), @i i from attribute, (sele
ct @i:=0, @u:=0) x order by pid, IF( (stock_1+stock_2)>0, 0,1 ), `order`) t wher
e i<1;
+------+--------+-------+-------+---------+---------+
| pid  | atr_id | price | order | stock_1 | stock_2 |
+------+--------+-------+-------+---------+---------+
|    1 |      1 |    50 |     1 |       3 |       2 |
|    2 |      5 |    90 |     2 |       0 |       1 |
+------+--------+-------+-------+---------+---------+
2 rows in set (0.00 sec)

Неактивен

 

#5 02.03.2017 00:16:57

Warrior1
Участник
Зарегистрирован: 09.02.2017
Сообщений: 3

Re: Помогите Join только одной строки

Может кому буде интересно решил задачу следующим образом, по производительности вроде норм запрос, но это работает если только нужно 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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson