2017-10-20 69 views
0

我有2個表,看起來像這樣的數據庫:MySQL的選擇數據

content 
id name 
1  Cool Stuff 
2  Even Better stuff 

-

contentFields 
id  content  label  value 
5  1   Rating  Spectacular 
6  1   Info  Top Notch 
7  2   Rating  Poor 

正如你所看到的在contentcontentFields表與content表的id列一致。

我想寫,抓住所有的內容和存儲與正確內容的適用內容字段的查詢,所以它出來這樣:

[ 
{ 
    id: 1, 
    name: 'Cool Stuff', 
    contentFields: [ 
    {label: 'Rating', value: 'Spectacular'}, 
    {label: 'Info', value: 'Top Notch'} 
    ] 
}, 
{ 
    id: 2, 
    name: 'Even Better Stuff', 
    contentFields: [ 
     {label: 'Rating', value: 'Poor'} 
    ] 
} 
] 

我試過內連接是這樣的:

SELECT * FROM content INNER JOIN contentFields ON content.id = contentFields.content GROUP BY content.id

但是這並沒有做到這一點。

*注意:我知道我可以用2個單獨的查詢來做到這一點,但我想了解如何在一箇中執行此操作,因爲這將顯着提高性能。

+0

查詢的結果是什麼樣的?因爲您要求提供JSON結果,我假設您是從MySQL結果構建的,使用哪種語言?你如何改變它? – Moseleyi

+0

它在NodeJS MySQL中,默認情況下將結果解析爲JSON – Jordash

+0

對於解析器的工作原理,您是否有任何要求MySQL結果的樣子? – Moseleyi

回答

0

您試圖實現的內容不僅僅可以用於SQL。

正如你已經表明你自己,你正在尋找一張表內的表。但是MySQL並不知道這些概念,據我所知,其他數據庫也不知道。結果集總是像一張表;結果集的每一行都具有相同的結構。

所以,要麼讓你的GROUP BY content.id到位;那麼對於結果集中的每一行,MySQL將從連接表中選擇一個隨機行,該行適合該行的content.id(您甚至不能依賴它每次都是同一行)。

或者您刪除了GROUP BY;那麼你將得到連接表中的每一行,但這不是你想要的。

當性能問題時,我可能會選擇第二個選項,並添加ORDER BY content.id,並自己生成JSON。您可以循環訪問結果集,並在每次content.id更改時開始一個新的JSON塊。

免責聲明以下是純粹的推測。

我對node.js以及它如何將結果集轉換爲JSON一無所知。但我強烈認爲你可以配置它的行爲;否則,在大多數情況下,它實際上不會有任何用處。因此,必須有一種方法來告訴它應該如何對結果集中的行進行分組。

如果我是對的,您首先必須告訴node.js如何對結果集進行分組,然後讓它處理上面第二個選項(即沒有0​​)的行。