-1

假设我有三个表“表A和表B”,数据如下:

A和B的数据

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

表 B 有以下数据:

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

现在,我想要的是:
如果 B.id 存在于 A 中并且具有属性“activeUser”,那么我的输出需要是“activeUser”,如果 B.id 存在于 A 中并且没有属性“activeUser”但具有“publicUser”然后“公共用户”

如果 A 中不存在 B.id,并且 B.Id 没有属性“publicUser”,那么我的输出需要类似于(“error”或其他标签)

谁能帮我?

谢谢大家,但我仍然有一个问题.. 假设 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

在此处查看小提琴。

我正在使用 LEFT JOIN 将 B 与 A 连接起来,以便返回 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 连接


数据库设计:

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 回答