2015-09-14 104 views
1

我的表people_jobsMySql的选择where列值是唯一

+--------+--------+ 
| NAME | JOB | 
+--------+--------+ 
| John | Actor | 
+--------+--------+ 
| Jane | Driver | 
+--------+--------+ 
| Bill | Actor | 
+--------+--------+ 
| John | Cook | 
+--------+--------+ 

我希望选择具有职业演员,其中名称列将是独特的全名。这里所需的查询输出将只是Bill

喜欢的东西:

SELECT name FROM people_jobs WHERE job LIKE "actor" AND COUNT(SELECT * FROM people_jobs WHERE name LIKE name) = 1; 

这显然是错误语法,我不能让GROUP BY工作...思考?

+0

'SELECT distinct name FROM people_jobs WHERE job ='actor''类似的东西? – CollinD

+0

这仍然返回约翰和帐单。 –

+0

这是因为约翰和法案都是演员。你需要改变你的问题。我现在明白你想要选择名字在表格中只出现一次的所有演员。 – CollinD

回答

3

为什么选择?

SELECT name, COUNT(*) AS cnt 
FROM people_jobs 
WHERE job='Actor' 
GROUP BY name 
HAVING cnt = 1 

好了,现在我看到的问题。试试这个:

SELECT name, SUM(JOB='Actor') AS actor_cnt, COUNT(*) as job_cnt 
FROM people_jobs 
GROUP BY name 
HAVING (actor_cnt = 1) AND (job_cnt = 1) 

这会找出有多少人是演员,并计算有多少作业有,并且只返回其唯一的工作人行事。

+0

我无法得到这个工作,出于某种原因... –

+0

我仍然从这个查询获得约翰和比尔。 –

+0

这是因为他们都是演员,他们只在表中列出一次... –

1
SELECT name, COUNT(*) c 
FROM people_jobs 
WHERE job = 'Actor' 
GROUP BY name HAVING c = 1 
+0

这不应该是“GROUP BY名称”吗? – CollinD

+0

是的,那是我刚刚发现的一个错字。固定。 – mmccaff

+0

这个也可以。 – Zich

3
select name 
from people_jobs 
where name in (
    select name 
    from people_jobs 
    group by name 
    having count(name) = 1 
) and job like 'actor' 

这个例子是简单的理解,但我喜欢另一个问题:

SELECT name 
FROM people_jobs 
GROUP BY name 
HAVING COUNT(name) = 1 AND sum(job = 'Actor') = 1 
+0

你可以添加一些解释如何工作?否则,很好的答案! –

+0

这一个是对的我认为 – Zich

1
SELECT DISTINCT x.* 
      FROM people_jobs x 
      LEFT 
      JOIN people_jobs y 
      ON y.name = x.name 
      AND y.job <> x.job 
      WHERE x.job = 'actor' 
      AND y.name IS NULL; 
+0

感谢您的意见,草莓。我在下面有一个可用的解决方案,但我绝对会给你一个upvote。 –

0

我会用NOT EXISTS在这种情况下:

SELECT name 
FROM people_jobs 
WHERE job = 'actor' 
     AND NOT EXISTS (SELECT * FROM people_jobs pj 
         WHERE pj.name = people_jobs.name AND pj.job != 'actor') 
-1

更容易并解决你的问题:

SELECT distinct name FROM people_jobs WHERE job = "Actor"