mysql SQL -行不存在为存在

chhkpiq4  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(111)

我有3个表。一个有用户列表,一个有项目,一个有用户和项目之间的关系。用户可以有一个项目(stat = 0/1),也可以有一个副本(dup = 0/1)。如果你点击项目或副本的按钮,它会运行一个查询,添加或更新行。
它看起来像这样:

| user | item_id | stat | dup |
| ---- | ------- | ---- | --- |
| 17   |   1     |  1   |  1  |
| 5    |   2     |  1   |  0  |
| 8    |   1     |  0   |  1  |
| 9    |   4     |  1   |  0  |

我比较这些数据谁有一个项目什么其他没有,反之亦然与此查询:

SELECT t2.user_id,
       GROUP_CONCAT(CASE WHEN t1.dup=1 AND t2.stat=0 THEN item_id END) `My Item List`,
       GROUP_CONCAT(CASE WHEN t2.dup=1 AND t1.stat=0 THEN item_id END) `Item List`
FROM table3 t1
LEFT JOIN table3 t2 USING (item_id)
WHERE t1.user_id = @current_user
  AND t2.user_id <> @current_user
GROUP BY t2.user_id

我的问题是,我只能比较行,如果用户已经点击了按钮的项目至少一次,所以行生成,但我需要的stat=0行,以及即使他们不存在。
在代码运行之后,表应该看起来像这样,所以即使用户没有(stat=0)那个项目,我也可以看到关系:

| user | item_id | stat | dup |
| ---- | ------- | ---- | --- |
| 17   |   1     |  1   |  1  |
| 5    |   2     |  0   |  0  |
| 5    |   6     |  1   |  0  |
| 8    |   1     |  0   |  1  |
| 9    |   4     |  1   |  0  |
| 9    |   6     |  0   |  0  |
| 17   |   13    |  0   |  0  |

如何将其集成到上面的查询中?
我的表:
表1

CREATE TABLE table1(
    id NOT NULL AUTO_INCREMENT,
    user_name varchar(255),
);

表二

CREATE TABLE table2(
    id NOT NULL AUTO_INCREMENT,
    item_no varchar(255),
    item_name varchar(255),
    item_group varchar(255)
);

表3

CREATE TABLE table3 (
  id int NOT NULL AUTO_INCREMENT,
  user_id int NOT NULL,
  item_id int NOT NULL,
  stat tinyint NOT NULL,
  dup tinyint NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (user_id) REFERENCES table1(id),
  FOREIGN KEY (item_id) REFERENCES table2(id)
);

谢谢大家!

4c8rllxm

4c8rllxm1#

如果你只抓取user和item_id的所有唯一组合,然后只Map存在的组合,其余的都为null,会怎么样?我们可以用0替换null。
比如说

SELECT 
  all_combos.user, 
  all_combos.item_id, 
  COALESCE(T.stat, 0) AS stat, 
  COALESCE(T.dup) AS dup 
FROM 
  (
    SELECT 
      user, 
      item_id 
    FROM 
      (SELECT DISTINCT user FROM table3) u, 
      (SELECT DISTINCT item_id FROM table3) i
  ) AS all_combos 
  LEFT OUTER JOIN table3 T ON T.user = all_combos.user 
  AND T.item_id = all_combos.item_id

相关问题