0

我有表称为: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

SELECTSELECT另一个SELECT子查询中只使用一个查询而不使用多个查询的最佳解决方案是什么?表中将有数千条记录,因此我希望可以使用最有效的查询。

4

1 回答 1

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 扩展来允许选择非分组、非聚合列。另外,我假设还有一个 studentid 字段,您为了清楚起见而忽略了它,否则整个系统将只支持一个学生。

于 2012-09-29T19:00:37.850 回答