2014-12-04 33 views
1

这里是我的两个表:我如何总是从一个表中提取数据,但是如果MySQL中有数据,还要从第二个表中提取数据?

绿洲

+-----+-------+ 
| 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不匹配。

如何解决我的查询做到这一点?

+2

只要让它成为'LEFT JOIN'。 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/你需要将你的'USERNAME ='greg''移动到on子句。 – Andrew 2014-12-04 22:10:09

+0

@Andrew你应该把这个评论作为答案;它解决了问题:) – Barranka 2014-12-04 22:15:15

回答

0

这就是手册上说,只要坚持到MySQL ... “如果没有在右边表中没有匹配行或使用零件的LEFT JOIN,与所有列的列设置为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

它也清楚,为什么要摆脱用户名准则正如Andrew所说,ON子句的where子句...

0

你想要一个left join,但你必须要小心的where子句中的条件。在表条件需要是on子句中的left join工作:

SELECT * 
FROM oasis JOIN 
    user_collection 
    ON oasis.id = user_collection.oasisid and user_collection.username = 'greg' 
WHERE oasis.id = '234'; 

条件的第一where子句中应该去。

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' 
相关问题