我有一张桌子:
表格小组
Id_team member_1 member_2 member_3
1 Alice Ben
2 Ben
3 Charles Alice Ben
4 Ben Alice
我需要知道Alice有多少个不同的团队成员(如果她是第一个成员,第二个或第三个成员,则不计算在内)。在我的样本中,正确的答案是2(Ben在Id_team 1和4中,Ben和Charles在Id_team = 3)。谢谢!
答案 0 :(得分:3)
您必须分别计算每列中的“alices”以确保不同的列
您看来要检查的是“
SELECT
COUNT(DISTINCT CASE WHEN member_1 = 'Alice' THEN member_1 END) +
COUNT(DISTINCT CASE WHEN member_2 = 'Alice' THEN member_2 END) +
COUNT(DISTINCT CASE WHEN member_3 = 'Alice' THEN member_3 END)
FROM tablename
WHERE 'Alice' IN(member_1, member_2, member_3);
更新:已修复COUNT
答案 1 :(得分:2)
好的,所以你想让不同职位的同一支队伍(例如Alice& Ben,Ben和Alice)算作一个。
要执行此操作,请按升序为每个位置的alice命令,并计算结果(这将为您的示例返回2):
SELECT COUNT(*) FROM
(
SELECT
least( member_2, member_3) AS l,
greatest(member_2, member_3) AS g
FROM teams
WHERE
member_1 = 'Alice'
UNION
SELECT
least( member_1, member_3) AS l,
greatest(member_1, member_3) AS g
FROM teams
WHERE
member_2 = 'Alice'
UNION
SELECT
least( member_1, member_2) AS l,
greatest(member_1, member_2) AS g
FROM teams
WHERE
member_3 = 'Alice'
) q
;
请注意,这只能针对3个成员团队的特殊情况进行,因为最少和最大的人可以选择其他两个成员 - 对于4人及以上的成员国,需要更复杂的解决方案。
答案 2 :(得分:2)
您可以尝试连接字段(按字母顺序排序),以便将它们转换为字符串列表。
然后在此列表中运行distinct
(因此它将列出所有单独的团队)
然后搜索包含Alice
从这个开始,最难的是“按字母顺序排列”,因为我无法找到任何好的功能,但GROUP_CONCAT
有一个单独的SELECT
和UNION
要将字段转换为行应该这样做:
SELECT COUNT(*)
FROM (
SELECT DISTINCT team_as_string
FROM (
SELECT id tid, GROUP_CONCAT(q ORDER BY q ASC SEPARATOR ',') team_as_string
FROM (
SELECT id, member_1 q FROM teams
UNION SELECT id, member_2 q FROM teams
UNION SELECT id, member_3 q FROM teams
/* add more fields if needed */
) c
GROUP BY tid
) b
) a
WHERE team_as_string LIKE '%Alice%'
我没有检查它的语法错误,但它应该是合理的。测试并给出正确的答案(2)
如果需要,可以为更多成员增强。
当然,如果成员位于单独的连接表中,则可以简化整个group_concat部分。
答案 3 :(得分:1)
我需要知道Alice有多少个不同的团队
试试这个:
SELECT 'Alice', COUNT(id_team)
FROM tablename
WHERE 'Alice' IN(member_1, member_2, member_3);
结果:
| ALICE | THECOUNT |
--------------------
| Alice | 3 |
如果id_team
不唯一,请使用COUNT(DISTINCT id_team)
。