假设我有一个包含两列begin_timestamp
和images
的表。
首先,我要声明
SELECT images
FROM myTable
WHERE begin_timestamp < 1546646400 && images != 'default.png';
这将为我返回一个字符串列表,如:
'123.jpg'
'abc.jpg'
'test.jpg'
第二步,我要检查该列表中的一项或多项在孔表中是否重复。如果是,则将该字符串从列表中踢出。就像表中的另一行包含123.jpg
作为图像值一样,我只希望列表如
[abc.jpg, test.jpg]
我的问题是,现在如何将第一步和第二步结合到一条mySQL语句上?
答案 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