MySQL查询问题 - 左连接

时间:2013-06-24 16:43:31

标签: mysql left-join

假设我有三个表“表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”,那么“publicUser”

如果A中不存在B.id,并且B.我没有属性“publicUser”那么我的输出必须是(“错误”或其他标签)

任何人都可以帮助我吗?

谢谢大家, 但我仍然有一个问题..假设B.Id不存在于A.Id和B.Id没有属性PublicUser ..在这种情况下,我希望例如(“null”)作为此行的输出在您的解决方案中,此案例的输出将是“PublicUser”,但不是我预期的在您的解决方案中是否有任何可能的更新来解决此问题?非常感谢

2 个答案:

答案 0 :(得分: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

请参阅小提琴here

我使用LEFT JOIN将A与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

小提琴是here

答案 1 :(得分:0)

首先欢迎来到StackOverflow(!)

尽管你的问题似乎更多“学习”而不是“以解决我公司的问题”,我选择使用ENUM,它具有优势和缺点,因为您可能希望看到here 我也在使用primary keysinline IF()SQL joins


数据库设计:

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;

此致

LeonardoAssumpção


[编辑]

考虑到我们的谈话,这是第一个建议(甚至浪费时间和脑力):

Diagram1

假设它符合您的真实目的,可能的查询知道哪个客户端是否是vip只是

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

但也许它仍然是错的。合作伙伴和客户之间是否存在直接关系? P.S:完整的sql here