Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从2个可能重复的表中选择数据_Mysql - Fatal编程技术网

Mysql 从2个可能重复的表中选择数据

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 在一切平等的情况下

我在表格中有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
在一切平等的情况下,我想找回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行。我假设有些地方找不到一个县。我会检查数据并尽快更新。谢谢