我正在查询今年有多少活动人士多次参加团队志愿服务;我让它作为一个独立的查询工作:
SELECT Activists.team, COUNT(id) AS Activists
FROM
(
SELECT e.id, v.team,
COUNT(CASE WHEN (e.status="Completed" AND right(e.date,2)="15") THEN e.id END) AS count
FROM actiontable e
LEFT JOIN persontable v ON v.id = e.id
GROUP BY e.id, v.team
HAVING (count > 1)
) AS Activists
GROUP BY Activists.team;
Run Code Online (Sandbox Code Playgroud)
但我不太清楚如何让它在更长的SELECT
声明中发挥作用。我遇到的问题是,我还有许多其他(更简单)的查询部分,可以在语句中按团队返回内容,例如SELECT
:
COUNT(DISTINCT CASE WHEN v.WillCanvass = "X" THEN v.id END)
Run Code Online (Sandbox Code Playgroud)
显然,我不能获得HAVING (count > 1)
活动人士的查询部分,因为那样它会影响我SELECT
声明的所有其他部分——所以我需要上面的子查询只影响我正在处理的唯一部分。
我用示例模式制作了一个SQL Fiddle来帮助完成上述有效的查询 - 但理想的情况是获得与此类似的输出,其中子查询Activists
不会影响WillCanvass
列(即使我编造了数字)以下):
Team Activists …
Run Code Online (Sandbox Code Playgroud) 我在MySQL中创建了一个相对简单的查询,JOIN
根据名字和姓氏匹配的位置给出了三个表.从那里开始,我想编写另一个查询,然后只显示那些没有得到匹配的记录JOIN
- 但我无法弄清楚如何做到这一点.我假设它与使用涉及类似NOT IN
和我的原始查询的子查询有关,但我无法得到它给我想要的结果.
这是我尝试提出的部分功能正常的解决方法:
SELECT *,
if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match") AS "t2 Match",
if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match") AS "t3 Match"
FROM t1
LEFT JOIN t2 ON t2.first=t1.first AND t2.last=t1.last
LEFT JOIN t3 ON t3.first=t1.first AND t3.last=t1.last
WHERE if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match")="No Match"
OR if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match")="No Match";
Run Code Online (Sandbox Code Playgroud)
我觉得这是相当简单和直接的事情,但我没有得到正确的结果.有人可以帮忙吗?
谢谢!