1

我有一张桌子:

桌队

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)。谢谢!

4

4 回答 4

3

您必须分别计算每列中的“爱丽丝”以确保不同的列

您似乎要检查的是“

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

于 2013-01-17T09:06:56.493 回答
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 和更大的成员数,需要更复杂的解决方案。

于 2013-01-17T09:01:35.933 回答
2

您可以尝试连接字段(按字母顺序排序)以将它们转换为字符串列表。然后distinct在这个列表上运行一个(所以它会列出所有单独的团队)然后搜索包含多少个字符串Alice

从这里最难的是“按字母顺序连接”,因为我真的找不到任何好的功能来做到这一点,但是GROUP_CONCAT用单独SELECT的 s 和UNIONs 将字段转换为行应该可以做到:

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 部分可以简化。

于 2013-01-17T09:57:18.077 回答
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).

于 2013-01-17T09:03:51.533 回答