Предпочтение в Mysql resultset - PullRequest
0 голосов
/ 18 октября 2019

При выполнении запроса ниже в Mysql я получаю несколько записей.

SELECT * 
  FROM catalog_product_entity_int 
 WHERE attribute_id = 99 
   and row_id = 378050

+----------+--------------+----------+--------+-------+
| value_id | attribute_id | store_id | row_id | value |
+----------+--------------+----------+--------+-------+
| 12101931 |           99 |        0 | 378050 |     4 |
| 21858725 |           99 |        3 | 378050 |     1 |
| 21861516 |           99 |        4 | 378050 |     1 |
+----------+--------------+----------+--------+-------+

Мне нужен запрос, который будет извлекать значение для store_id 3, а если store_id 3 отсутствует, то значение store_id 0.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Получить максимальный store_id и присоединиться к источнику

drop table if exists t;
create table t
( value_id int, attribute_id int, store_id int, row_id int, value int);
insert into t values
( 12101931 ,           99 ,        0 , 378050 ,     4 ),
( 21858725 ,           99 ,        3 , 378050 ,     1 ),
( 21861516 ,           99 ,        4 , 378050 ,     1 ),
( 12101931 ,           99 ,        0 , 378051 ,     4 ),
( 21858725 ,           99 ,        5 , 378051 ,     1 ),
( 21861516 ,           99 ,        4 , 378051 ,     1 ),
( 12101931 ,           99 ,        1 , 378052 ,     4 ),
( 21858725 ,           99 ,        5 , 378052 ,     1 ),
( 21861516 ,           99 ,        4 , 378052 ,     1 ),
( 21861516 ,           99 ,        4 , 378053 ,     1 );


select t.* 
from t
join (select attribute_id, row_id, max(store_id) maxstore
        from t 
        where attribute_id = 99 and store_id in(0,3)
        group by  attribute_id, row_id) s 
        on s.attribute_id = t.attribute_id and s.row_id = t.row_id and s.maxstore = t.store_id;

+----------+--------------+----------+--------+-------+
| value_id | attribute_id | store_id | row_id | value |
+----------+--------------+----------+--------+-------+
| 21858725 |           99 |        3 | 378050 |     1 |
| 12101931 |           99 |        0 | 378051 |     4 |
+----------+--------------+----------+--------+-------+
2 rows in set (0.00 sec)
0 голосов
/ 18 октября 2019

Попробуйте, пожалуйста

SELECT 
IF((SELECT Count(*) FROm catalog_product_entity_int WHERE store_id = 3) > 0,value ,
IF((SELECT Count(*) FROm catalog_product_entity_int  WHERE store_id = 0) > 0,value ,0)) value
  FROM catalog_product_entity_int 
 WHERE attribute_id = 99 
   and row_id = 378050
 GROUP BY row_id 

Сначала будет выбрано значение store_id 3, если у вас есть такая строка в выбранных вами строках. Затем он пытается получить значение store_id 0, и если это также не удается, значение равно 0 .

Последняя часть, которую вы должны проверить, как вы обнаружите, что нет ни store_id3 или store_id 0 в вашем выборе.

Группировка по предложению должна контролироваться. В конце концов attribute_id может быть лучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...