我有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)
);
谢谢大家!
1条答案
按热度按时间4c8rllxm1#
如果你只抓取user和item_id的所有唯一组合,然后只Map存在的组合,其余的都为null,会怎么样?我们可以用0替换null。
比如说