MySQL查询返回单个表中的所有行,而不考虑其他地方的匹配行
我正在尝试实现MySQL版本的完全连接,但没有运气。我的结果需要包括来自“users”的所有行,无论该用户在其他表中是否有匹配的行。现在,我的结果并不完全是由于左连接的性质,但当我将所有的左连接和右连接在一起时,我的结果会进一步缩小MySQL查询返回单个表中的所有行,而不考虑其他地方的匹配行,mysql,left-join,union-all,right-join,Mysql,Left Join,Union All,Right Join,我正在尝试实现MySQL版本的完全连接,但没有运气。我的结果需要包括来自“users”的所有行,无论该用户在其他表中是否有匹配的行。现在,我的结果并不完全是由于左连接的性质,但当我将所有的左连接和右连接在一起时,我的结果会进一步缩小 SELECT users.*, profile_status.*, photos.*, general.*, experience.*, occupation.*, flagged.*, last_update.*, job_search.*,
SELECT
users.*, profile_status.*, photos.*, general.*, experience.*, occupation.*,
flagged.*, last_update.*, job_search.*, users.user_id AS userID,
user_profile_status.user_id AS profileID
FROM users
JOIN profile_status ON users.user_id = profile_status.user_id
LEFT JOIN photos ON users.user_id = photos.user_id AND photos.selected = 1
LEFT JOIN general ON users.user_id = general.user_id
LEFT JOIN occupation ON users.user_id = occupation.user_id
LEFT JOIN experience ON users.user_id = experience.user_id
LEFT JOIN flagged ON users.user_id = flagged.user_id
LEFT JOIN job_search ON users.user_id = job_search.user_id
LEFT JOIN last_update ON users.user_id = last_update.user_id
WHERE
users.approved = 1 AND users.admin_level = 0
ORDER BY last_update.last_update DESC
我对工会的企图
SELECT
users.*, profile_status.*, photos.*, general.*, experience.*, occupation.*,
flagged.*, last_update.*, job_search.*, users.user_id AS userID,
user_profile_status.user_id AS profileID
FROM users
JOIN profile_status ON users.user_id = profile_status.user_id
LEFT JOIN photos ON users.user_id = photos.user_id AND photos.selected = 1
LEFT JOIN general ON users.user_id = general.user_id
LEFT JOIN occupation ON users.user_id = occupation.user_id
LEFT JOIN experience ON users.user_id = experience.user_id
LEFT JOIN flagged ON users.user_id = flagged.user_id
LEFT JOIN job_search ON users.user_id = job_search.user_id
LEFT JOIN last_update ON users.user_id = last_update.user_id
UNION ALL
SELECT
users.*, profile_status.*, photos.*, general.*, experience.*, occupation.*,
flagged.*, last_update.*, job_search.*, users.user_id AS userID,
user_profile_status.user_id AS profileID
FROM users
JOIN profile_status ON users.user_id = profile_status.user_id
RIGHT JOIN photos ON users.user_id = photos.user_id AND photos.selected = 1
RIGHT JOIN general ON users.user_id = general.user_id
RIGHT JOIN occupation ON users.user_id = occupation.user_id
RIGHT JOIN experience ON users.user_id = experience.user_id
RIGHT JOIN flagged ON users.user_id = flagged.user_id
RIGHT JOIN job_search ON users.user_id = job_search.user_id
RIGHT JOIN last_update ON users.user_id = last_update.user_id
WHERE
users.approved = 1 AND users.admin_level = 0
ORDER BY last_update.last_update DESC
表结构:
Table users
user_id first_name last_name admin_level user_approved
1 tommy jones 0 1
2 johnny rocket 0 1
3 sally hotpants 0 1
Table profile_status
user_id photo_uploaded
1 1
2 1
3 1
Table photos
photo_id user_id filename selected
1 1 photo_1.jpg 1
2 2 photo_2.jpg 0
3 2 photo_2.jpg 1
4 3 photo_3.jpg 1
Table general
user_id city state zip neighborhood
1 baltimore maryland 00125 hamsterdam
2 lakeland maine 11542 treemont
2 tipper vermont 08483 NULL
Table experience
user_id waldorf kumon homeschooling
1 0 1 0
2 0 0 1
Table occupation
user_id occupation
1 teacher
2 student
3 student
Table job_search
search_id user_id job
1 1 art teacher
2 2 designer
Table flagged
user_id flagged
1 1
2 0
Table last_update
update_id user_id last_update photo_update
1 1 0000-00-00 00:00:00 0000-00-00 00:00:00
2 2 0000-00-00 00:00:00 0000-00-00 00:00:00
工会的第二部分都毫无意义。关于第一部分:有没有可能有用户在profile_status上没有匹配的记录?从其他示例来看,我似乎可以先左加入,然后联合,然后右加入,并获得与完全加入类似的结果。用户和profile_status是同时创建的,因此不可能有没有相应profile_status记录的用户只要将第一个连接更改为LEFT JOIN,查询就可以执行您想要的操作。我明白了,您试图模拟完整的外部连接,这在这里毫无意义,因为您正在进行正确的连接,但在WHERE子句中包含user表。此外,如果您想从用户表中获取所有匹配行,为什么需要获取该表中不存在的行?@Jamie。左外部联接链将保留第一个表中的所有行,而不管其他表中是否有匹配项。where子句只在第一个表上,因此它会过滤这些行——这大概就是您希望查询执行的操作。