Mysql 从列中提取子字符串并检查该子字符串是否与其他子字符串匹配

Mysql 从列中提取子字符串并检查该子字符串是否与其他子字符串匹配,mysql,sql,Mysql,Sql,我正在处理一些SQL查询,有一个问题我被卡住了。 在我的问题中,我有一个表“world”,其中包含一个字段“name”,问题是找出前三个首字母匹配的两个国家的名称,如Australia->AUS和Australia->AUS,而不重复这些国家 SELECT a.name,SUBSTRING(a.name FROM 1 FOR 3) as cif, b.name,SUBSTRING(b.name FROM 1 FOR 3) as cis FROM world a,world b where a.

我正在处理一些SQL查询,有一个问题我被卡住了。 在我的问题中,我有一个表“world”,其中包含一个字段“name”,问题是找出前三个首字母匹配的两个国家的名称,如Australia->AUS和Australia->AUS,而不重复这些国家

SELECT a.name,SUBSTRING(a.name FROM 1 FOR 3) as cif,
b.name,SUBSTRING(b.name FROM 1 FOR 3) as cis
FROM world a,world b 
where a.name!=b.name 
group by a.name,b.name 
having cif=cis
结果:

name            cif name            cis
Australia       Aus Austria         Aus
Austria         Aus Australia       Aus
Bahamas         Bah Bahrain         Bah
Bahrain         Bah Bahamas         Bah
Belarus         Bel Belgium         Bel
Belarus         Bel Belize          Bel
Belgium         Bel Belarus         Bel
Belgium         Bel Belize          Bel
Belize          Bel Belarus         Bel
Belize          Bel Belgium         Bel
Burkina Faso    Bur Burma           Bur
name            cif name            cis
Australia       Aus Austria         Aus

Bahamas         Bah Bahrain         Bah

Belarus         Bel Belgium         Bel
Belarus         Bel Belize          Bel

Belgium         Bel Belize          Bel


Burkina Faso    Bur Burma           Bur
在上面的结果中,你们会看到一些国家在重复,比如澳大利亚和奥地利在第一排,而不是奥地利和澳大利亚在第二排,结果应该是这样的

结果:

name            cif name            cis
Australia       Aus Austria         Aus
Austria         Aus Australia       Aus
Bahamas         Bah Bahrain         Bah
Bahrain         Bah Bahamas         Bah
Belarus         Bel Belgium         Bel
Belarus         Bel Belize          Bel
Belgium         Bel Belarus         Bel
Belgium         Bel Belize          Bel
Belize          Bel Belarus         Bel
Belize          Bel Belgium         Bel
Burkina Faso    Bur Burma           Bur
name            cif name            cis
Australia       Aus Austria         Aus

Bahamas         Bah Bahrain         Bah

Belarus         Bel Belgium         Bel
Belarus         Bel Belize          Bel

Belgium         Bel Belize          Bel


Burkina Faso    Bur Burma           Bur
增加一个不平等:

SELECT a.name, SUBSTRING(a.name FROM 1 FOR 3) as cif, b.name, SUBSTRING(b.name FROM 1 FOR 3) as cis
FROM bbc a JOIN
     bbc b 
     ON a.name < b.name 
GROUP BY a.name, b.name 
HAVING cif = cis;
如果存在重复项,则使用
选择不同的
分组依据
,但这仅在原始数据中存在重复项时才需要。

如我所愿和@GordonLinoff所见,请在此处使用
分组依据
,原因如下
来自世界a,世界b,其中a.name=b、 按a.name、b.name命名组
SQL部分是wierd,因为您正在交叉连接并将其过滤到较小的集合中