0

我有一张桌子,上面有这个人知道的人和语言。例如

Name    Language

John    Engl ish
Bill    English
John    German
Bill    Japanese
Li      Chinese 

我想选择所有懂英语和德语的人。简单的方法是这样做:

select name from persons p where 
exists (select 1 
        from persons pp 
        where pp.name=p.name 
        and pp.language="English")
AND
exists (select 1 from persons pp 
        where pp.name=p.name 
        and pp.language="English")

请求的复杂度为 n^2;但是,如果我需要选择所有懂英语、德语和俄语的人怎么办?我将有 n^3 的复杂度。等等..有没有更快的方法呢?

4

4 回答 4

1

你想要说英语and日语的人的名字;不是英文or日文的人名,对吗?如果是这样,这是一种无需任何连接或子查询的方法:

select name, count(name)
from persons
where language in ('English', 'Japanese')
group by name
having count(name)=2

如果您需要添加更多语言,只需将其他语言添加到where子句中,并将最后一行中的数字增加到您拥有的语言数。

于 2013-07-22T19:20:00.353 回答
0

将表结构修改为:

人们

person_id | name
----------+------
1         | John
2         | Bill
3         | Li

语言

language_id | language
------------+---------
1           | English
2           | German
3           | Japanese
4           | Chinese

people_have_languages

person_id | language_id
----------+------------
1         | 1
2         | 1
1         | 2
2         | 3
3         | 4

现在您将拥有一个规范化的表结构,这将是您的查询:

SELECT
  `people`.`name`
FROM
  `people`
  INNER JOIN `people_have_languages` ON (`people`.`person_id`=`people_have_languages`.`person_id`)
  INNER JOIN `languages` ON (`people_have_languages`.`language_id`=`languages`.`language`)
WHERE
  `language` IN ('English', 'German', 'Russian')
GROUP BY
  `people`.`person_id`
于 2013-07-22T19:30:24.383 回答
0

尝试这个:

select name from persons p where p.language in ('English', 'German', 'Russian');
于 2013-07-22T19:14:29.097 回答
0

试试这个选择

Select name from (
    Select name, GROUP_CONCAT(DISTINCT language
              ORDER BY language ASC SEPARATOR ' ') as gr from persons group by name) as t
WHERE gr = 'English Russian';

但这适用于完全匹配。您可以使用 INSTR mysql 功能搜索更多语言。

但是,我的主要建议是创建另一个结构,因为您有多对多关系。

于 2013-07-22T19:24:53.497 回答