1

私はテーブルを持っています:

テーブルチーム

Id_team         member_1         member_2         member_3
1                Alice            Ben
2                Ben
3                Charles          Alice            Ben
4                Ben              Alice

アリスがメンバーになっているチームの数を知る必要があります(彼女が最初のメンバーであるか、2番目または3番目のメンバーであるかはカウントされません)。私のサンプルでは、​​正解は2です(Id_team 1と4にBenがあり、Id_team = 3にBenとCharlesがあります)。ありがとうございました!

4

4 に答える 4

3

明確なoer列を確保するには、各列の「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を修正

于 2013-01-17T09:06:56.493 に答える
2

さて、あなたは異なるポジション(例えば、アリス&ベン、ベン&アリス)を持つ同じチームを1つとして数えたいと思います。

これを行うには、すべての位置でアリスの昇順でメンバーを並べ替え、結果をカウントします(これにより、例に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つのメンバーチームの特殊なケースでのみ実行できることに注意してください。最小および最大で他の2つのメンバーを選択できるためです。4以上のメンバーカウンの場合、より複雑なソリューションが必要です。

于 2013-01-17T09:01:35.933 に答える
2

フィールドを文字列のリストに変換するために、フィールドを(アルファベット順にソートして)連結することを試みることができます。次に、distinctこのリストでを実行します(したがって、すべての個別のチームがリストされます)次に、含まれている文字列の数を検索しますAlice

これから最も難しいのは「アルファベット順の連結」です。これを実行するための適切な関数を実際に見つけることができなかったためですが、フィールドを行に変換するためのGROUP_CONCAT個別SELECTのsとsを使用して実行する必要があります。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部分全体を簡略化できます。

于 2013-01-17T09:57:18.077 に答える
1

アリスがメンバーになっているチームの数を知る必要があります

これを試して:

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 に答える