我有一个表my_table
,其中包含字段group_id
,region
,value
。我想从每个组中选择值链,但仅当region = US
用于组中的所有记录时。
我最初尝试的查询是
SELECT
GROUP_CONCAT(
value
ORDER BY DATE DESC SEPARATOR '<-'
) AS value_chain
FROM my_table
WHERE region = 'US'
GROUP BY (group_id)
这是不正确的,好像在同一个链中有US
条记录和CA
条记录,CA
记录将在GROUP BY
之前省略,并且US
记录将作为一组大小为1返回。在这种情况下,我根本不想返回链。
有没有一种很好的方法来实现这一目标? 出于性能原因,我宁愿不构建所有区域的所有链,然后尽可能过滤。
答案 0 :(得分:2)
试试这个:
SELECT GROUP_CONCAT(value ORDER BY DATE DESC SEPARATOR '<-') AS value_chain
FROM my_table
GROUP BY group_id
HAVING SUM(region <> 'US') = 0
这将过滤出至少有一个非'US'值的组。
-- drop table if exists my_table;
create table my_table
( group_id int not null,
region varchar(20) not null,
value int not null,
date date not null
);
-- truncate table my_table;
insert my_table values
(1,'US',100,'2016-01-07'),
(1,'CAD',200,'2016-01-06'),
(2,'US',700,'2016-02-07'),
(3,'CAD',666666,'2016-01-07'),
(4,'US',1200,'2016-02-04'),
(4,'US',1400,'2016-02-03');
SELECT GROUP_CONCAT(value ORDER BY DATE DESC SEPARATOR '<-') AS value_chain
FROM my_table
GROUP BY group_id
HAVING SUM(region <> 'US') = 0
+-------------+
| value_chain |
+-------------+
| 700 |
| 1200<-1400 |
+-------------+