MySQL GROUP BY没有来自另一列的交叉

时间:2016-07-25 13:53:10

标签: mysql

我有一个表my_table,其中包含字段group_idregionvalue。我想从每个组中选择值链,但仅当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返回。在这种情况下,我根本不想返回链。

有没有一种很好的方法来实现这一目标? 出于性能原因,我宁愿不构建所有区域的所有链,然后尽可能过滤。

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