| 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 |
我想选择latitude
和longitude
的每个唯一组合。所以我想过滤掉任何重复的对。我还需要过滤掉年份小于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;
我尝试的是什么?
答案 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 |
+--------------+------+----------+-----------+