2012-04-26 90 views
0

這個問題很難總結成一句話。我有兩張桌子 - 其中一張桌子是由外部飼料自動更新的。第二個表包含第二個表中某些行的額外信息,由唯一鍵標識。這裏有一個例子:我應該如何將兩個表合併爲一個SELECT?

 
Table1 
    id: int PRIMARY KEY 
    channel: varchar(255) UNIQUE KEY 
    name: varchar(255) NOT NULL 
    verified: tinyint(1) NOT NULL 

Table2 
    id: int PRIMARY KEY 
    channel: varchar(255) UNIQUE KEY 
    extra_info: varchar(255) 

表1是主表。這是實際選定的表格。我希望Table2中的字段(id和channel除外)在選擇時移動到Table1,就好像表1中存在的Table2中的所有行在選擇時合併一樣。

例如,我想這兩個表中的信息,最終成爲JSON輸出這樣

[{ 
    "id": 5, 
    "channel": "bkids2", 
    "name": "Bkid", 
    "verified": true, 
    "extra_info": "Some extra information added using Table2" 
}, 
... 
] 

我不知道該怎麼繼續以最快的方式是。我可以使用SQL語法快速執行嗎?我知道某些類型的查詢速度非常慢,所以也許只是在兩個表中獲取所有數據並使用服務器端編程語言執行合併會更快一些?

我半路上假設前者是正確的答案,在這種情況下:我怎麼連做這個使用MySQL?子查詢?加入?聯盟?

我得承認我不完全瞭解這兩種技術的工作,或者如何快速/慢速他們經營,所以感謝任何人誰能夠在正確的方向指向我。

回答

1

試試這個:

SELECT Table1.*, IFNULL(Table2.extra_info, 'DefaultValue') as extra_info 
FROM Table1 LEFT OUTER JOIN Table2 
ON Table1.id = Table2.id 
+0

這工作幾乎是完美的,但如何,我從表2爲默認值設置列如果行找不到?例如,如果由於table2中找不到匹配的行而導致無法爲表填充'extra_info'列,請將其設置爲字符串「{}」或數字或其他內容? – Hubro 2012-05-06 17:30:23

+0

我已經編輯了我的答案,將'IFNULL(Table2.extra_info,'DefaultValue')添加爲extra_info'。 – 2012-05-07 05:57:23

+0

優秀,感謝 – Hubro 2012-05-07 07:51:58

0

您可以編寫一個查詢來獲取所需的輸出。

SELECT id, channel, name, verified, extra_info FROM table_1 NATURAL JOIN table_2 

該查詢將兩個表連接起來並顯示兩者之間的公共結果。 希望這是回答你的問題....

+0

@codemonkey:是U醒了,這是否是答案與否.... – Addicted 2012-04-26 06:27:09

+0

我清醒。在提出這個問題後我離開了工作。當我回家時,我肯定會嘗試你的建議:-)你能解釋一下這個解決方案與@ aziz-shaikh的答案不同嗎?優點缺點? – Hubro 2012-04-26 07:57:27

+0

就像你看到的,他是基於單個列連接兩個表的是第一列分別.... ,我基於兩個表(它就像非規範化) – Addicted 2012-04-26 08:23:59

相關問題