我试图在没有运气的情况下实现 MySQL 的 FULL JOIN 版本。我的结果需要包括来自“用户”的所有行,无论用户在其他表中是否有匹配的行。现在我的结果并不全是由于 LEFT JOIN 的性质,但是当我 UNION ALL、LEFT 和 RIGHT 时,我的结果会进一步缩小。
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
我对 UNION 的尝试
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