返回没有重复的mysql行

时间:2019-01-04 14:30:17

标签: mysql sql greatest-n-per-group

假设我有一个包含两列begin_timestampimages的表。

首先,我要声明

SELECT images 
FROM myTable 
WHERE begin_timestamp < 1546646400 && images != 'default.png';

这将为我返回一个字符串列表,如:

'123.jpg'
'abc.jpg'
'test.jpg'

第二步,我要检查该列表中的一项或多项在孔表中是否重复。如果是,则将该字符串从列表中踢出。就像表中的另一行包含123.jpg作为图像值一样,我只希望列表如

[abc.jpg, test.jpg]

我的问题是,现在如何将第一步和第二步结合到一条mySQL语句上?

3 个答案:

答案 0 :(得分:4)

您可以使用GROUP BY来实现。

首先,让我们如上所述进行选择:

SELECT images
FROM myTable
WHERE begin_timestamp < 1546646400 AND images != 'default.png'
GROUP BY images;

现在,由于我们已按images分组,因此可以访问aggregate functions。我们可以在查询末尾添加所需的过滤器:

HAVING COUNT(images) = 1

请注意,由于我们已经按images进行了分组,因此这是我们唯一可以直接在SELECT部分中进行查询的内容。如果您要选择其他任何字段,则还需要通过聚合函数进行选择,例如SELECT images, MIN(some_field)。或者,如果images是主键,则在子查询或联接中使用它。


如果需要在应用WHERE过滤条件之前 删除重复项,则可以使用如下子查询:

SELECT images FROM (
    SELECT images, MIN(begin_timestamp) as begin_timestamp
    FROM myTable
    GROUP BY images
    HAVING COUNT(images) = 1)
WHERE begin_timestamp < 1546646400 AND images != 'default.png';

答案 1 :(得分:2)

另一种方法是不存在。

我假设您在表中有id字段:

SELECT images 
FROM myTable m1
where m1.begin_timestamp < 1546646400 && m1.images != 'default.png'
and NOT EXISTS(select 1 from myTable m2 where m1.images = m2.images and m1.id != m2.id)

答案 2 :(得分:0)

声明@image varchar(max) 设置@image =''

SELECT @ image = @ image +','+图像 从myTable 在begin_timestamp <1546646400 AND images!='default.png'的地方 按图片分组 拥有COUNT(*)= 1

选择@image