“辅助”查询

时间:2011-09-15 15:00:43

标签: mysql

我是MySQL的新手,我在试图弄清楚如何解决以下问题时遇到了麻烦:

1 - 我有一个包含某些人数据的表格,包括姓名,数字代码和每个人的类别。

让我们说“JOHN DOE”就是其中之一,他的号码是“1111”,他的类别是“A”; “FOO”是另一个,编号为“2222”,类别为“B”;而“BAR”是另一个,数字代码“3333”和类别“A”。

2 - 类别“A”中的每个人都被填写以填写填写我数据库中第二个表格的表格。在此表中,对每个答案的负责人的引用是他/她的号码。每个人也可以不止一次回答表格。

问题是:现在我需要一张表格,告诉我谁回答了表格,谁没有。

PS:让我们调用数据库“data_base”,第一个表“people”(带有“name”,“num_code”和“category”列)和第二个表“answers”(带有列“num_code”和“answer”)。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

这可以通过子查询简单地解决:

SELECT 
    `num_code`, 
    `name`, 
    (
        SELECT COUNT(*) 
        FROM `answers` 
        WHERE `num_code` = `people`.`num_code`
    ) AS `AnswerCount`
FROM
    `people`
ORDER BY
    `name`

在SQL中有很多方法可以解决这个问题。上述结果格式的一个优点是您将获得每人的答案数。因此,如果它是0,那么你知道他们没有填写一个。

答案 1 :(得分:0)

您可以使用所谓的“LEFT JOIN”执行此操作。它获取people中的所有记录,并将它们链接到answers中的记录。然后使用where子句,从结果中删除确实具有答案的所有记录,并且仅返回那些不具有答案的记录。

select
  p.* 
from 
  people p
  left join answers a on a.num_code = p.num_code
where
  a.num_code is null

另一种解决方案是使用NOT EXISTS。实际上使用它有点干净,但也有点复杂(你需要一个子选择)。它已证明(对我来说)在MySQL中较慢。