仅列出在mysql中出现三次的行

时间:2012-09-29 18:54:12

标签: mysql join

我有一个名为activitiesdeficiencies的表格。

activities表包含学生注册的所有活动。 deficiencies表包含学生因注册活动而可能获得的所有缺陷。

以下是包含示例数据的表结构:

活动表

activityid  title
-------------------------------------------------------------
1           Student Retreat
2           Student Orientation

缺陷表

deficiencyid    activity_id     deficiency      status
-------------------------------------------------------------
1               1               NARRATION       CLEARED
2               1               PHOTO           CLEARED
3               1               REPORT          CLEARED
4               2               NARRATION       WAITING
5               2               PHOTO           CLEARED
6               2               REPORT          WAITING

对于每个活动条目,deficiencies表中将有三行。 如果其中列出的项目的所有状态都已CLEARED ,我希望能够列出每个活动一次。因此,如果一个或多个仍然是WAITING - 它们不会在查询中列出。

我试图使用此查询执行此操作,但我无法获得任何幸运:

SELECT * FROM deficiencies,activities WHERE status='CLEARED' AND activityid=activity_id AND COUNT(deficiencyid)=3 GROUP BY activity_id ORDER BY deficiencyid ASC

我从MySQL获得以下内容:

Invalid use of group function

我期待的输出是activities表中的第一条记录。

在另一个SELECT子查询中,在SELECT中只使用一个没有多个SELECT的查询的最佳解决方案是什么?表中会有数千条记录,所以我希望可以使用最有效的查询。

1 个答案:

答案 0 :(得分:1)

如果您想通过JOIN执行此操作:

 SELECT A.activityid, A.title FROM activities A INNER JOIN deficiencies D 
    ON A.activityid = D.activityid WHERE D.status = 'CLEARED'
    GROUP BY A.activityID, A.title HAVING COUNT(*) = 3

这会加入活动和缺陷表,过滤除CLEARED以外的记录,按活动分组,并筛选出其中没有正好三条记录的组。

它要求保证数据与您描述的一样(总是三个缺陷记录)。我写了GROUP BY以避免使用MySQL扩展,允许选择非分组的非聚合列。另外,我假设还有一个学生领域,为了清楚起见你遗漏了,否则整个系统只支持一个学生。