Mysql 从列中提取子字符串并检查该子字符串是否与其他子字符串匹配
我正在处理一些SQL查询,有一个问题我被卡住了。 在我的问题中,我有一个表“world”,其中包含一个字段“name”,问题是找出前三个首字母匹配的两个国家的名称,如Australia->AUS和Australia->AUS,而不重复这些国家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.
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,因为您正在交叉连接并将其过滤到较小的集合中