过滤重复组合多个列

时间:2015-08-28 08:04:48

标签: mysql

示例表

| name         | year | latitude | longitude |
|--------------|------|----------|-----------|
| Cleveland    | 1800 | 10       | 11        |
| Cleveland    | 1810 | 10       | 11        |
| Medina       | 1811 | 12       | 13        |
| Dayton       | 1812 | 14       | 15        |
| Sandusky     | 1105 | 50       | 50        |
| Mount Vernon | 1813 | 50       | 50        |

我打算做什么

我想选择latitudelongitude的每个唯一组合。所以我想过滤掉任何重复的对。我还需要过滤掉年份小于1500的任何记录。

这是我试图实现的子集:

| name         | year | latitude | longitude |
|--------------|------|----------|-----------|
| Cleveland    | 1800 | 10       | 11        |
| Medina       | 1811 | 12       | 13        |
| Dayton       | 1812 | 14       | 15        |
| Mount Vernon | 1813 | 50       | 50        |

每条记录year都大于1500,并且没有任何重复的纬度,长对。

我尝试了什么

我试图找到一种方法来使用DISTINCT。我发现的一切都没有效果。

我也尝试过使用GROUP BY

SELECT *
FROM users
GROUP BY latitude, longitude
HAVING year > 1500;

上述查询的问题是,它消除了包含lat,long对50,50的以下两个记录:

| name         | year | latitude | longitude |
|--------------|------|----------|-----------|
| Sandusky     | 1105 | 50       | 50        |
| Mount Vernon | 1813 | 50       | 50        |

该团体被淘汰,因为桑达斯基的year小于1500.我不想要桑达斯基的记录,但我确实想要弗农山。

我注意到,如果两个记录在哪里切换如此:

| name         | year | latitude | longitude |
|--------------|------|----------|-----------|
| Mount Vernon | 1813 | 50       | 50        |
| Sandusky     | 1105 | 50       | 50        |

...然后该组的年份设置为1813年,该组未被淘汰。我想也许按年分类可以解决它,但它没有:

SELECT *
FROM users
GROUP BY latitude, longitude
HAVING year > 1500
ORDER BY year DESC;

我尝试的是什么?

3 个答案:

答案 0 :(得分:3)

这个怎么样?

SELECT `id`, `name`, MAX(users.year) as `year`, latitude, longitude
FROM users
WHERE year > 1500
GROUP BY latitude, longitude;

结果:

| 7 | Columbus     | 1978 | 7  | 8  
| 1 | Cleveland    | 1800 | 10 | 11 
| 3 | Medina       | 1811 | 12 | 13 
| 4 | Dayton       | 1812 | 14 | 15 
| 6 | Mount Vernon | 1813 | 50 | 50 

唯一的区别是WHERE / HAVING的位置,因为它位于GROUP BY语句之前,它将在分组发生之前进行过滤,从而获得所需的结果

MAX(users.year)确保您始终获得该组中最大的一年。如果这对您无关紧要,您可以将SELECT `id`, `name`, MAX(users.year) as `year`, latitude, longitude替换为SELECT *

答案 1 :(得分:2)

也许我不明白这个问题,但这很简单:

select * from users u where u.year > 1500;

如果有一对以上相同的坐标且年份大于1500,我不知道你想做什么。

答案 2 :(得分:1)

除非是误读,否则这个怎么样。我读过了。它假设你想要不使用相同的lat,long

来消除不同的名称
create table users
(   id int auto_increment primary key,
    name varchar(50) not null,
    year int not null,
    latitude int not null,
    longitude int not null
);
truncate table users;
insert users (name,year,latitude,longitude) values
('Cleveland',1810,10,11),
('Medina',1811,12,13),
('Dayton',1812,14,15),
('Mount Vernon',1813,50,50),
('Sandusky',1105,50,50);

SELECT distinct name,year,latitude,longitude 
FROM users 
where year > 1500 
ORDER BY year;
+--------------+------+----------+-----------+
| name         | year | latitude | longitude |
+--------------+------+----------+-----------+
| Cleveland    | 1810 |       10 |        11 |
| Medina       | 1811 |       12 |        13 |
| Dayton       | 1812 |       14 |        15 |
| Mount Vernon | 1813 |       50 |        50 |
+--------------+------+----------+-----------+
相关问题