以下是我的两张表:
绿洲
+-----+-------+
| id | title |
+-------------+
| 234 | a |
| 235 | b |
| 236 | c |
+-----+-------+
user_collection
+----+---------+----------+------+
| id | oasisid | username | data |
+--------------+----------+------+
| 1 | 234 | joe | blah |
| 2 | 235 | bob | blah |
| 3 | 236 | ted | blah |
+----+---------+----------+------+
这是我的疑问:
SELECT *
FROM oasis
JOIN user_collection ON oasis.id = user_collection.oasisid
WHERE username = 'greg'
AND oasis.id = '234'
我想要做的是从匹配的绿洲和 user_collection 中提取所有内容,同时从绿洲中提取信息,即使有与 user_collection 不匹配。
如何修复查询以完成此操作?
答案 0 :(得分:0)
这是手册所说的,只是为了坚持MySQL ...... "如果LEFT JOIN中的ON或USING部分中的右表没有匹配的行,则将所有列设置为NULL的行用于右表。您可以使用此事实在表中查找在另一个表中没有对应项的行:
SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;"
http://dev.mysql.com/doc/refman/5.0/en/join.html
它还清楚地表明,为什么要将用户名条件从where子句移动到ON子句,正如安德鲁所说......
答案 1 :(得分:0)
您需要left join
,但必须注意where
子句中的条件。 second 表中的条件需要在on
子句中left join
才能生效:
SELECT *
FROM oasis JOIN
user_collection
ON oasis.id = user_collection.oasisid and user_collection.username = 'greg'
WHERE oasis.id = '234';
first 表中的条件应该放在where
子句中。
答案 2 :(得分:0)
SELECT s.ome
, c.olumns
FROM table1 s
LEFT
JOIN table2 c
ON c.some_id = s.some_id
AND c.some_column = 'one thing'
WHERE s.some_other_column = 'another thing'