2012-01-08 121 views
1

我有這樣一個有趣的情況。 這裏的表名爲 「mirror_data」=>缺少一些mysql查詢結果

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id_mir  | int(11)  | NO | PRI | NULL | auto_increment | 
| local  | varchar(255) | YES |  | NULL |    | 
| local_mir | varchar(255) | YES |  | NULL |    | 
| remote  | varchar(255) | YES |  | NULL |    | 
| remote_mir | varchar(255) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

這裏被命名爲第二個表 「數據」


+-----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+-----------------+--------------+------+-----+---------+-------+ 
| id    | int(11)  | NO |  | 0  |  | 
| localParty  | varchar(255) | YES |  | NULL |  | 
| other columns ...            | 
+-----------------+--------------+------+-----+---------+-------+ 

我從檢索數據表的信息,但我想的是,當(從「數據」表中)列localParty等於(來自「mirror_data」的表)本地列,然後從local_mir列(也來自「mirror_data」表)檢索信息,否則當標記的列彼此不相等時, localParty。但我想從「數據」表中檢索整個信息。

這裏是mirror_data插入值=>

+--------+--------+-----------+--------+------------+ 
| id_mir | local | local_mir | remote | remote_mir | 
+--------+--------+-----------+--------+------------+ 
|  1 | 715715 | Something | NULL | NULL  | 
|  2 | 1000 | some  | NULL | NULL  | 
+--------+--------+-----------+--------+------------+ 

,這裏是我的代碼如何我 「做」 這個=>

select IF(o.localParty=m.local,m.local_mir,o.localParty) FROM data as o, mirror_data as m limit 0,10; 

而且這裏導致此查詢做什麼(缺少一些值)=>

+---------------------------------------------------+ 
| IF(o.localParty=m.local,m.local_mir,o.localParty) | 
+---------------------------------------------------+ 
| Something           | 
| 715715           | 
| 14            | 
| 14            | 
| Something           | 
| 715715           | 
| Something           | 
| 715715           | 
| 978080           | 
| 943080           | 
+---------------------------------------------------+ 

就像你看到數715715是不是在這種情況下,因爲在mirror_data TA改變ble是兩個值(當他們會更多時,它會更有可能不會收到預期的結果),我如何編寫查詢來實現我的目標?

只是想要從「數據」表全部信息,而是不斷變化的(localparty)如果標記的情況發生(本地= localparty)

回答

1

您應該使用LEFT JOIN,以包括來自data表從mirror_table時提供的所有信息和信息..

如果沒有匹配,那麼m.local_mir將是NULL,所以你可以使用IFNULL

編輯回答子問題的意見

SELECT 
    IFNULL(m.local_mir, o.localParty) as local, 
    IFNULL(m.remote_mir, o.remoteParty) as remote 
FROM 
    data as o 
    LEFT JOIN mirror_data as m 
     ON (o.localParty = m.local OR o.remoteParty = m.remote) 
LIMIT 
    0,10; 
+0

非常感謝,請回答一個問題太多,這個查詢將會如何,如果我們增加遠程,完全相同的列和表,只需重命名本地遠程,請回答:) – DaHaKa 2012-01-08 19:55:07

+0

請當你看到答案,謝謝:) – DaHaKa 2012-01-08 20:24:06

+0

@DaHaKa,更新的答案.. – 2012-01-08 21:48:15

1

您有效連接表datamirror_data,但都沒有加盟條件一個WHERE子句來定義這兩個表是如何關聯的。

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data as o, 
    mirror_data as m 
/* Need an equivalent column to join on */ 
WHERE o.some_column = m.some_related_column 
limit 0,10; 

使用新版,JOIN語法:

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data AS o, 
    JOIN mirror_data AS m ON o.some_column = m.some_related_column 
LIMIT 0, 10;