mysql return 如果 user_id 作为 met_user 存在则为真
mysql return true if user_id exists as met_user
我是 MYSQl 的新手。我正在尝试创建一个适合我需要的查询。我开发了一个 sqlfiddle.
这是故事。我有 5 tables。用户、地点、会议、参加和会面。
最后,我希望能够选择地点来查看那里举行的会议。我想查看每次会议的与会者。我相信我可以很容易地完成这一切。但是...
这是我挂断的地方。我想显示正在参加会议的所有用户的列表(实际上,这应该不包括我自己的 ID)。因此,一列应该是 user_names,列出所有参加会议的用户(不包括我),另一列列出我遇到的人,显示为 True 或 False 或类似的东西。因此,来自 meeting_id 的所有用户和来自 table 的所有用户都遇到了我的 user_id 和他们的 user_id 作为 met_user 的所有用户。
我可以实现 mysql 的许多不同元素。我正在为这个而苦苦挣扎。
这是我的架构
CREATE TABLE users (user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30) NOT NULL);
CREATE TABLE places (place_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
place_name VARCHAR(30) NOT NULL);
CREATE TABLE meetings (meeting_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
place_id INT(6),
meeting_name VARCHAR(30) NOT NULL);
CREATE TABLE attend (attend_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
meeting_id INT(6),
user_id INT(6));
CREATE TABLE met (met_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
meeting_id INT(6),
user_id INT(6),
met_user INT(6));
INSERT INTO users (user_name)
VALUES ('Jason'), ('Billy'), ('Sarah'), ('Julie'), ('Jennifer'), ('Laura') ;
INSERT INTO places (place_name)
VALUES ('London'), ('Paris'), ('New York'), ('Rome');
INSERT INTO meetings (place_id, meeting_name)
VALUES ('1', 'London Meeting #1'), ('1','London Meeting #2'), ('2','Paris Meeting'), ('3','New York Meeting'), ('4','Rome Meeting');
INSERT INTO attend (meeting_id, user_id)
VALUES ('1', '1'), ('2','1'), ('1','2'), ('1','3'), ('1','4'), ('1','5'), ('1','6');
INSERT INTO met (meeting_id, user_id, met_user)
VALUES ('1', '1', '2'), ('1', '1', '3'),('1', '1', '4'), ('1', '2', '1'), ('1', '2', '3'), ('1', '2', '4');
这是我认为可能最接近的查询之一。
Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*
from users as u
JOIN attend as at
ON at.user_id = u.user_id
JOIN meetings as m
ON at.meeting_id = m.meeting_id
LEFT JOIN met as met
ON met.user_id = at.user_id
Where m.meeting_id = 1
此查询显示了我的所有(在本例中我是 Jason)met_user、比利的所有 met_user,以及所有其他与会者的空值(这是我的一部分想要)。
**[Results][2]**:
| user_id | user_name | meeting_id | user_id | meeting_name | met_id | meeting_id | user_id | met_user |
|---------|-----------|------------|---------|-------------------|--------|------------|---------|----------|
| 1 | Jason | 1 | 1 | London Meeting #1 | 1 | 1 | 1 | 2 |
| 1 | Jason | 1 | 1 | London Meeting #1 | 2 | 1 | 1 | 3 |
| 1 | Jason | 1 | 1 | London Meeting #1 | 3 | 1 | 1 | 4 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 4 | 1 | 2 | 1 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 5 | 1 | 2 | 3 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 6 | 1 | 2 | 4 |
| 3 | Sarah | 1 | 3 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 4 | Julie | 1 | 4 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 5 | Jennifer | 1 | 5 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 6 | Laura | 1 | 6 | London Meeting #1 | (null) | (null) | (null) | (null) |
你是否想实现这样的目标? (如果没有,你能post你期望的查询结果吗):
select u.user_id,u.user_name,
case when exists (select * from met where met.user_id = 1 AND met.met_user = u.user_id) then 'true' else 'false' end didIMeet
from users as u join attend as at
on u.user_id = at.user_id
join meetings as m
on at.meeting_id = at.meeting_id
where m.meeting_id = 1
and u.user_id <> 1
一个扩展您的查询的潜在解决方案:
Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*, case when met.met_id is null then 'no' else 'yes' end as met
from users as u
JOIN attend as at
ON at.user_id = u.user_id
JOIN meetings as m
ON at.meeting_id = m.meeting_id
LEFT JOIN met as met
ON (met.user_id = at.user_id and met.met_user = 1)
Where m.meeting_id = 1
AND u.user_id != 1
- 过滤掉你的user_id
- 使用您的 user_id 作为左连接中的附加连接条件
- 在 select 中使用 case when 条件表达式来获取 'yes' / 'no' 而不是 NULL 或一些数字
此方法的一个问题是您的 table 未完全填满。为此,您需要为每个配对输入两个条目:(1 1 3) 和 (1 3 1)、(1 1 4) 和 (1 4 1) 等。我认为无论如何您都需要完整的配对您想为另一个用户重复查询。
我是 MYSQl 的新手。我正在尝试创建一个适合我需要的查询。我开发了一个 sqlfiddle.
这是故事。我有 5 tables。用户、地点、会议、参加和会面。
最后,我希望能够选择地点来查看那里举行的会议。我想查看每次会议的与会者。我相信我可以很容易地完成这一切。但是...
这是我挂断的地方。我想显示正在参加会议的所有用户的列表(实际上,这应该不包括我自己的 ID)。因此,一列应该是 user_names,列出所有参加会议的用户(不包括我),另一列列出我遇到的人,显示为 True 或 False 或类似的东西。因此,来自 meeting_id 的所有用户和来自 table 的所有用户都遇到了我的 user_id 和他们的 user_id 作为 met_user 的所有用户。
我可以实现 mysql 的许多不同元素。我正在为这个而苦苦挣扎。
这是我的架构
CREATE TABLE users (user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30) NOT NULL);
CREATE TABLE places (place_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
place_name VARCHAR(30) NOT NULL);
CREATE TABLE meetings (meeting_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
place_id INT(6),
meeting_name VARCHAR(30) NOT NULL);
CREATE TABLE attend (attend_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
meeting_id INT(6),
user_id INT(6));
CREATE TABLE met (met_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
meeting_id INT(6),
user_id INT(6),
met_user INT(6));
INSERT INTO users (user_name)
VALUES ('Jason'), ('Billy'), ('Sarah'), ('Julie'), ('Jennifer'), ('Laura') ;
INSERT INTO places (place_name)
VALUES ('London'), ('Paris'), ('New York'), ('Rome');
INSERT INTO meetings (place_id, meeting_name)
VALUES ('1', 'London Meeting #1'), ('1','London Meeting #2'), ('2','Paris Meeting'), ('3','New York Meeting'), ('4','Rome Meeting');
INSERT INTO attend (meeting_id, user_id)
VALUES ('1', '1'), ('2','1'), ('1','2'), ('1','3'), ('1','4'), ('1','5'), ('1','6');
INSERT INTO met (meeting_id, user_id, met_user)
VALUES ('1', '1', '2'), ('1', '1', '3'),('1', '1', '4'), ('1', '2', '1'), ('1', '2', '3'), ('1', '2', '4');
这是我认为可能最接近的查询之一。
Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*
from users as u
JOIN attend as at
ON at.user_id = u.user_id
JOIN meetings as m
ON at.meeting_id = m.meeting_id
LEFT JOIN met as met
ON met.user_id = at.user_id
Where m.meeting_id = 1
此查询显示了我的所有(在本例中我是 Jason)met_user、比利的所有 met_user,以及所有其他与会者的空值(这是我的一部分想要)。
**[Results][2]**:
| user_id | user_name | meeting_id | user_id | meeting_name | met_id | meeting_id | user_id | met_user |
|---------|-----------|------------|---------|-------------------|--------|------------|---------|----------|
| 1 | Jason | 1 | 1 | London Meeting #1 | 1 | 1 | 1 | 2 |
| 1 | Jason | 1 | 1 | London Meeting #1 | 2 | 1 | 1 | 3 |
| 1 | Jason | 1 | 1 | London Meeting #1 | 3 | 1 | 1 | 4 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 4 | 1 | 2 | 1 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 5 | 1 | 2 | 3 |
| 2 | Billy | 1 | 2 | London Meeting #1 | 6 | 1 | 2 | 4 |
| 3 | Sarah | 1 | 3 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 4 | Julie | 1 | 4 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 5 | Jennifer | 1 | 5 | London Meeting #1 | (null) | (null) | (null) | (null) |
| 6 | Laura | 1 | 6 | London Meeting #1 | (null) | (null) | (null) | (null) |
你是否想实现这样的目标? (如果没有,你能post你期望的查询结果吗):
select u.user_id,u.user_name,
case when exists (select * from met where met.user_id = 1 AND met.met_user = u.user_id) then 'true' else 'false' end didIMeet
from users as u join attend as at
on u.user_id = at.user_id
join meetings as m
on at.meeting_id = at.meeting_id
where m.meeting_id = 1
and u.user_id <> 1
一个扩展您的查询的潜在解决方案:
Select u.*, at.meeting_id, at.user_id, m.meeting_name, met.*, case when met.met_id is null then 'no' else 'yes' end as met
from users as u
JOIN attend as at
ON at.user_id = u.user_id
JOIN meetings as m
ON at.meeting_id = m.meeting_id
LEFT JOIN met as met
ON (met.user_id = at.user_id and met.met_user = 1)
Where m.meeting_id = 1
AND u.user_id != 1
- 过滤掉你的user_id
- 使用您的 user_id 作为左连接中的附加连接条件
- 在 select 中使用 case when 条件表达式来获取 'yes' / 'no' 而不是 NULL 或一些数字
此方法的一个问题是您的 table 未完全填满。为此,您需要为每个配对输入两个条目:(1 1 3) 和 (1 3 1)、(1 1 4) 和 (1 4 1) 等。我认为无论如何您都需要完整的配对您想为另一个用户重复查询。