2014-09-25 35 views
0

我有我需要加入加入從一個兩個表的數據顯示,如果有任何

  fields_data          fields 
+------------+-----------+------+    +------+-------------+----------+ 
| relationid | fieldname | data |    | name | displayname | position | 
+------------+-----------+------+    +------+-------------+----------+ 
|  2  | ftp | test |    | user | Username | top | 
|  2  | other | 1234 |    | pass | Password | top | 
+------------+-----------+------+    | ftp | FTP  | top | 
               | log | Log  | top | 
               | txt | Text  | mid | 
               +------+-------------+----------+ 

我想從「域」表中獲取所有的行,如果他們有位置這兩個表「top」,如果一行與fields_data中的name = fieldname匹配,它也應該顯示數據。這是我加入

SELECT 
fd.`data`, 
fd.`relationid`, 
fd.`fieldname`, 
f.`name`, 
f.`displayname` 

FROM `fields` AS f 

LEFT OUTER JOIN `fields_data` AS fd 
ON fd.`fieldname` = f.`name` 

WHERE f.`position`='top' AND (fd.`relationid`='3' OR fd.`relationid` IS NULL) 

我的問題是,上面的查詢只給了我這樣的結果:

+------+------------+-----------+------+-------------+ 
| data | relationid | fieldname | name | displayname | 
+------+------------+-----------+------+-------------+ 
| NULL | NULL  | NULL  | user | Username | 
| NULL | NULL  | NULL  | pass | Password | 
| NULL | NULL  | NULL  | log | Log  | 
+------+------------+-----------+------+-------------+ 

稱爲「FTP」的字段缺少,由於其關係到「2」。 。但是我仍然想把它顯示爲結果,但像其他的NULL一樣。如果SQL查詢的「fd。relationid ='2'」而不是3,它會得到相同的結果,但是包含名稱爲ftp的行在三個字段中保存數據。

我希望你明白我的意思。我的英語不是最好的..繼承人的結果,我想:

with above query containing fd.`relationid`='3' 
+------+------------+-----------+------+-------------+ 
| data | relationid | fieldname | name | displayname | 
+------+------------+-----------+------+-------------+ 
| NULL | NULL  | NULL  | user | Username | 
| NULL | NULL  | NULL  | pass | Password | 
| NULL | NULL  | NULL  | ftp | FTP  | 
| NULL | NULL  | NULL  | log | Log  | 
+------+------------+-----------+------+-------------+ 

    with above query containing fd.`relationid`='2' 
+------+------------+-----------+------+-------------+ 
| data | relationid | fieldname | name | displayname | 
+------+------------+-----------+------+-------------+ 
| NULL | NULL  | NULL  | user | Username | 
| NULL | NULL  | NULL  | pass | Password | 
| test | 2   | ftp  | ftp | FTP  | 
| NULL | NULL  | NULL  | log | Log  | 
+------+------------+-----------+------+-------------+ 

回答

0

你想要的條件移至on條款:

SELECT fd.`data`, fd.`relationid`, fd.`fieldname`, f.`name`, f.`displayname` 
FROM `fields` f LEFT OUTER JOIN 
    `fields_data` fd 
     ON fd.`fieldname` = f.`name` AND fd.`relationid` = '3' 
WHERE f.`position`='top' ; 

有趣的是,您的查詢和此查詢的語義不同 - 並且您發現確切的情況:當的值與另一個值匹配時,where子句形式將該行過濾掉。這仍然會保持一切。

作爲一個說明,下面還你想要做什麼:

SELECT fd.`data`, fd.`relationid`, fd.`fieldname`, f.`name`, f.`displayname` 
FROM `fields` f LEFT OUTER JOIN 
    (SELECT fd.* 
     FROM `fields_data` fd 
     WHERE fd.`relationid` = '3' 
    ) fd 
    ON fd.`fieldname` = f.`name` 
WHERE f.`position` = 'top' ; 

(因爲子查詢物化),我不會推薦編寫查詢這樣,特別是在MySQL。然而,理解爲什麼你的版本與這些版本不同(以及爲什麼它們是相同的)是掌握外部連接的一大進步。

+0

不能看到這將如何帶來ftp記錄... – apomene 2014-09-25 12:44:46

+0

@apomene。 。 。我認爲OP意味着'fields'中的FTP記錄不在'fields_data'中。我的答案中的兩個查詢都會返回位置爲'top''的'fields'中的所有行。 OP查詢過濾出特定的記錄。 – 2014-09-25 12:46:45

相關問題