-1

「テーブルAとテーブルB」という3つのテーブルと、次のようなデータがあるとします。

AとBのDATA

table A ID's : "3,4,9"

テーブル B には次のデータがあります。

("3" "activeUser")
("3" "publicUser")
("4" "activeUser")
("9" "publicUser")

今、私が欲しいのは
、B.idがAに存在し、属性「activeUser」を持っている場合、B.idがAに存在し、属性「activeUser」を持たないが「publicUser」を持っている場合、出力は「activeUser」である必要があります。パブリックユーザー」

B.id が A に存在せず、B.Id に "publicUser" 属性がない場合、出力は ("error" または他のラベル) のようになる必要があります。

誰でも私を助けることができますか?

ありがとう、しかし、私はまだ1つの問題があります.. B.IdがA.Idに存在せず、B.IdにPublicUser属性がないと仮定します..この場合、出力としてたとえば(「null」)が期待されますこの行のソリューションでは、この場合の出力は「PublicUser」になりますが、期待したものではありませんこの問題を解決するためにソリューションに可能な更新はありますか? どうもありがとう

4

2 に答える 2

1

次のようなクエリを使用できます。

SELECT
  B.id,
  CASE WHEN
    MAX(CASE WHEN B.attribute = "activeUser" THEN 1 ELSE 0 END) = 1
    AND COUNT(A.id)>0
  THEN
    'activeUser'
  ELSE
    'publicUser'
  END userType
FROM
  B LEFT JOIN A ON B.id=A.ID
GROUP BY
  B.id

ここでフィドルを参照してください。

B からすべての行を返し、一致する A からの行のみを返すために、LEFT JOIN を使用して B を A と結合しています。

次に、B.id でグループ化し、 を計算してMAX(CASE WHEN B.attribute = "activeUser" THEN 1 ELSE 0 END)います。少なくともその ID に関連付けられた行に属性 activeUser が設定されている場合、MAX() は Null を返し、それ以外の場合は 0 を返します。

次に、によって返された行を数えていますCOUNT(A.id)。ID が A に存在する場合、COUNT は > 0 になります。

編集

私があなたのコメントを正しく理解していれば、あなたはこれを探していると思います:

SELECT
  B.id,
  CASE WHEN
    MAX(CASE WHEN B.attribute = "activeUser" THEN 1 ELSE 0 END) = 1
    AND COUNT(A.id)>0
  THEN
    'activeUser'
  ELSE
    CASE WHEN MAX(CASE WHEN B.attribute = "publicUser" THEN 1 ELSE 0 END) = 1
         THEN 'publicUser' END
  END userType
FROM
  B LEFT JOIN A ON B.id=A.ID
GROUP BY
  B.id

フィドルはこちらです。

于 2013-06-24T16:49:13.437 に答える
0

まず、StackOverflow へようこそ (!)

あなたの質問は「私の会社の問題を解決するため」というよりも「学ぶため」のように思えますが、ここで見たいと思うかもしれないように、長所と短所があるENUMを使用することにしました。 また、主キーインライン IF()、およびSQL 結合も使用しています。


DB 設計:

CREATE TABLE A (id INT PRIMARY KEY NOT NULL);

CREATE TABLE B (
  id INT NOT NULL,
  status ENUM('publicUser','activeUser') NOT NULL DEFAULT 'publicUser',
  PRIMARY KEY(id, status)
);

INSERT INTO A VALUES (3),(4),(9);

INSERT INTO B VALUES (3, 'activeUser'), (3, 'publicUser'),
(4, 'activeUser'), (9, 'publicUser'), (10, 'activeUser');

クエリ:

SELECT
  B.id AS `B_id`,
  IF (
    A.id IS NULL,
    'publicUser',
    IF (
      MAX(B.status + 0) = 2, 'activeUser', 'publicUser'
    )
  ) AS `result`
FROM B
  LEFT JOIN A USING (id)
GROUP BY B.id;

よろしく、

レオナルド・アサンプソン


[編集]

私たちの会話を考慮して、これが最初の提案です(または時間と頭の無駄です):

ダイアグラム1

それがあなたの本当の目的に合っていると仮定すると、どのクライアントがvipであるかどうかを知るための可能なクエリは単純になります

SELECT
  c.id AS `client_id`,
  c.client_name,
  IF(c.is_vip, "active", "public") as `TEST`
FROM client AS c;

でも、まだ間違っているかもしれません。パートナーとクライアントの間に直接的な関係はありますか? PS:ここで
SQL を完成させます

于 2013-06-24T18:25:10.407 に答える