我有一个名为activities
和deficiencies
的表格。
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
的查询的最佳解决方案是什么?表中会有数千条记录,所以我希望可以使用最有效的查询。
答案 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扩展,允许选择非分组的非聚合列。另外,我假设还有一个学生领域,为了清楚起见你遗漏了,否则整个系统只支持一个学生。