Mysql 从2个可能重复的表中选择数据
我在表格中有81190个城镇名称,列名为:TownName 我有一个32117个独特记录名称的列表,以以下方式存储在表B中:镇、县、卷 我想为81190个城镇的名字中的每一个挑选一个县。因此,我的问题如下Mysql 从2个可能重复的表中选择数据,mysql,Mysql,我在表格中有81190个城镇名称,列名为:TownName 我有一个32117个独特记录名称的列表,以以下方式存储在表B中:镇、县、卷 我想为81190个城镇的名字中的每一个挑选一个县。因此,我的问题如下 Select TownName, County, Volume From tableA Inner Join tableB On TownName = Town Where Town = TownName Order By TownName, Volume, County 在一切平等的情况下
Select TownName, County, Volume
From tableA
Inner Join tableB
On TownName = Town
Where Town = TownName
Order By TownName, Volume, County
在一切平等的情况下,我想找回81190张唱片
然而,我有91669张唱片。我明白这是为什么。一个城镇名称可以在表B中出现多次,因为同一城镇名称可以出现在多个县
返回的记录示例如下:
Abinton Limerick 0
Abinton Limerick 0
Abinton Lanarkshire 11
Abinton Lanarkshire 11
Abinton Northamptonshire 13
Abinton Northamptonshire 13
Abington在tableA中出现两次,在tableB中出现三次,并在我需要的2条记录上返回6条记录
我应该如何修改我的查询以便返回容量最大的县,例如:
Abinton Northamptonshire 13
Abinton Northamptonshire 13
我最终得到了81190张唱片
提前感谢您的帮助。请尝试以下查询
CREATE TEMPORARY TABLE IF NOT EXISTS tableC AS (SELECT DISTINCT Town, County FROM tableB);
Select TownName, County
From tableA
Left Join tableC
On tableA.TownName = tableC.Town
Order By TownName, Volume;
尽管我认为你的描述令人困惑。您描述“我有一个32117个唯一记录名称的列表存储在表B中”和“一个城镇名称可以在表B中出现多次”。如果表A中是这种情况,您是否有唯一的泰文名称?如果没有,则在加入表时始终会有重复项也许您可以使用窗口函数MAX。 比如:
Select TownName, County, Volume
From
(Select TownName, County, Volume, max(Volume) over (partition by TownName) as highest_volume
From tableA
Inner Join tableB
On TownName = Town) as x
where Volume = x.highest_volume
Order By TownName, Volume, County
编辑
这是再现你的情况的正确方法吗
create table tableA (
TownName varchar(100)
);
create table tableB (
Town varchar(100),
County varchar(100),
Volume integer
);
insert into tableA values('Abinton');
insert into tableA values('Abinton');
insert into tableB values('Abinton','Limerick',0);
insert into tableB values('Abinton','Lanarkshire',11);
insert into tableB values('Abinton','Northamptonshire',13);
如果您使用的是MySQL,则此查询必须有效:
SELECT
a.TownName,
(SELECT b1.County FROM tableB b1
WHERE b1.Town = a.TownName AND b1.Volume = b.max_volume
LIMIT 1) AS Country,
b.max_volume AS Volume
FROM tableA a
INNER JOIN (
SELECT Town, MAX(Volume) AS max_volume
FROM tableB
GROUP BY Town
) b ON b.Town = a.TownName
ORDER BY a.TownName, County
如果数据库服务器支持窗口功能,则查询可以更简单:
SELECT a.TownName, b.County, b.Volume
FROM tableA a
INNER JOIN (
SELECT Town, County, Volume,
ROW_NUMBER() OVER (PARTITION BY Town ORDER BY Volume DESC) rn
FROM tableB
) b
ON b.Town = a.TownName AND b.rn = 1
ORDER BY a.TownName, b.County
如果我理解正确,你需要表A中所有城镇的县名。因此,您可以尝试以下方法:
Select tableA.TownName, tableB.County, tableB.Volume
From tableA
left Join tableB
On tableA.TownName = tableB.Town
Where tableB.Volume= (select max(tB.Volume) from tableB as tB Where tB.Town = tableB.Town)
Order By tableA.TownName, tableB.County, tableB.Volume
这些记录是独一无二的。记录1阿宾顿,利默里克0,记录2阿宾顿,拉纳克郡,11记录3阿宾顿,北安普敦郡,13。不幸的是,有3种不同的Abington,如果我要在其中一种上使用,我想使用容量最大的一种。如果你的结果中不需要容量,它会让事情变得更简单。我更新了我的questionOnly,将26858 rowsTry返回ommit,与select“不同”。结果是什么?返回的是91669行代码错误,经过更正后,我仍然返回91669行。哪种更正?我编辑了,因为我忘记了一个字段。但我在这里测试并得到正确答案。你能给我一些插入,让我看看我在这里做的是否正确吗?where Volume=抛出错误-将其更改为where high_Volume=并且有效。“它有效”你是说你得到了解决方案还是没有得到任何错误?因为我认为如果你尝试我编辑的注释,它将以两种方式工作。我希望得到正确的结果:/但是你可以打赌,使用这个窗口函数将工作(嗯..我想是的:D)这看起来像解决方案-返回77978行。我假设有些地方找不到一个县。我会检查数据并尽快更新。谢谢