Mysql 对包含字符串的记录进行分组

Mysql 对包含字符串的记录进行分组,mysql,sql,group-by,Mysql,Sql,Group By,我有一个包含以下数据的表: +----+-----------------+ | id | country | +----+-----------------+ | 1 | i'm from usa | | 2 | i'm from italy | | 3 | i'm from china | | 4 | i'm from india | | 5 | she's from usa | | 6 | he's from china | +----+-----

我有一个包含以下数据的表:

+----+-----------------+
| id | country         |
+----+-----------------+
|  1 | i'm from usa    |
|  2 | i'm from italy  |
|  3 | i'm from china  |
|  4 | i'm from india  |
|  5 | she's from usa  |
|  6 | he's from china |
+----+-----------------+
我想通过在国家栏中勾选国家名称来了解每个国家的人口。 我想要这样的东西:

+---------+------------+
| country | population |
+---------+------------+
| usa     | 2          |
| italy   | 1          |
| china   | 2          |
| india   | 1          |
+---------+------------+
我想我应该使用GROUPBY和COUNT函数。但是怎么做呢?
谢谢。

未经测试,但可能是解决方案

select SUBSTRING(country,(INSTR(country,'from') +5)), count(1) 
from table group by SUBSTRING(country,(INSTR(country,'from') +5))

未测试,但可能是解决方案

select SUBSTRING(country,(INSTR(country,'from') +5)), count(1) 
from table group by SUBSTRING(country,(INSTR(country,'from') +5))

如果国家总是在最后,你可以用这个

select
  case 
    when country like '%usa' then 'usa'
    when country like '%italy' then 'italy'
    when country like '%china' then 'china'
    when country like '%india' then 'india'
  end as ccountry,
  count(*) as population
from Table1
group by ccountry;
如果国家可以在字符串中的任何地方,你可以找到它,假设它是在起点、末端或中间被空间包围。


如果国家总是在最后,你可以用这个

select
  case 
    when country like '%usa' then 'usa'
    when country like '%italy' then 'italy'
    when country like '%china' then 'china'
    when country like '%india' then 'india'
  end as ccountry,
  count(*) as population
from Table1
group by ccountry;
如果国家可以在字符串中的任何地方,你可以找到它,假设它是在起点、末端或中间被空间包围。


假设国家名称始终是由空格分隔的国家/地区的最后一个组件,则可以执行以下操作:

select substring_index(country, ' ', -1) as real_country, count(*)
from your_table
group by real_country

提供国家/地区的最后一个单词。

假设国家/地区名称始终是国家/地区的最后一个组成部分,其中的组成部分由空格分隔,则可以执行以下操作:

select substring_index(country, ' ', -1) as real_country, count(*)
from your_table
group by real_country
这会告诉你国家的最后一个字。

也许这是有效的:

SELECT PARSENAME(REPLACE(country, ' ', '.'), 1) as parsedCountry, count(*) AS population
FROM table
GROUP BY parsedCountry
说明: 1. 替换国家/地区,“,” 只是用一个点替换所有的空间眼影。所以她是从美国来的,她是从美国来的

二,。 他来自美国,1岁 将在点上拆分字符串。然后从后到前数一,得到那部分字符串。将返回美国

三,。 从桌子上 我不知道你们桌子的名字…所以我把桌子放在桌子上

四,。 按解析的国家分组 它将在名称替换国家事件后进行分组。

也许这样可以:

SELECT PARSENAME(REPLACE(country, ' ', '.'), 1) as parsedCountry, count(*) AS population
FROM table
GROUP BY parsedCountry
说明: 1. 替换国家/地区,“,” 只是用一个点替换所有的空间眼影。所以她是从美国来的,她是从美国来的

二,。 他来自美国,1岁 将在点上拆分字符串。然后从后到前数一,得到那部分字符串。将返回美国

三,。 从桌子上 我不知道你们桌子的名字…所以我把桌子放在桌子上

四,。 按解析的国家分组
它将在parsename替换country Occurrences后进行分组。

如果您的“国家”名称可以来自另一个表,则这里有一个选项。这具有随“国家”名称列表的增长而增长的灵活性,无需进入并编辑SQL语句

我创建了一个临时表来匹配您的示例输入:

create table #citizens (id int, country varchar(30) )

insert into #citizens (id, country) values (1, 'i''m from usa')
insert into #citizens (id, country) values (2, 'i''m from italy')
insert into #citizens (id, country) values (3, 'i''m from china')
insert into #citizens (id, country) values (4, 'i''m from india')
insert into #citizens (id, country) values (5, 'she''s from usa')
insert into #citizens (id, country) values (6, 'he''s from china')
然后我创建了一个临时表countries来保存select的国家名称

create table #countries (country varchar(30) )

insert into #countries values('usa')
insert into #countries values('china')
insert into #countries values('india')
insert into #countries values('italy')
所需的select将如下所示。请注意类似“%”的内容

因为我只是随便玩玩,后来我把临时桌子扔了

drop table #countries
drop table #citizens

这里有一个选项,如果您的“国家”名称可以来自另一个表。这具有随“国家”名称列表的增长而增长的灵活性,无需进入并编辑SQL语句

我创建了一个临时表来匹配您的示例输入:

create table #citizens (id int, country varchar(30) )

insert into #citizens (id, country) values (1, 'i''m from usa')
insert into #citizens (id, country) values (2, 'i''m from italy')
insert into #citizens (id, country) values (3, 'i''m from china')
insert into #citizens (id, country) values (4, 'i''m from india')
insert into #citizens (id, country) values (5, 'she''s from usa')
insert into #citizens (id, country) values (6, 'he''s from china')
然后我创建了一个临时表countries来保存select的国家名称

create table #countries (country varchar(30) )

insert into #countries values('usa')
insert into #countries values('china')
insert into #countries values('india')
insert into #countries values('italy')
所需的select将如下所示。请注意类似“%”的内容

因为我只是随便玩玩,后来我把临时桌子扔了

drop table #countries
drop table #citizens

谢谢,但是你能解释一下吗?这里的“+5”是什么意思?如果国家名称在字符串中不在这个位置,例如在长文本中它在起始位置或位置50,它能找到它吗?instr函数找到文本位置。在本文中,它查找“from”文本,并返回第一次出现的文本。我来自美国,例如,它返回5。为了访问美国索引,我们必须为“from”文本字符添加5。我假设国家名称总是在“from”文本后面。谢谢,但你能解释一下吗?这里的“+5”是什么意思?如果国家名称在字符串中不在这个位置,例如在长文本中它在起始位置或位置50,它能找到它吗?instr函数找到文本位置。在本文中,它查找“from”文本,并返回第一次出现的文本。我来自美国,例如,它返回5。为了访问美国索引,我们必须为“from”文本字符添加5。我假设国家名称总是在“from”文本之后