2016-03-04 75 views
1

因此,我剛開始進入SQL編程,並着手與兩個表和一個數據透視表建立多對多關係。我將通過一個API發送這些信息,在我的前端以簡單的方式循環訪問數據將會很酷。將多個行組合到一箇中,從多到多

的表格看起來像以下:

story_template

id, title, body, author

空白

id, title, description

blanks_story_te mplate(透視)

id, sid, bid, position

我已經成功地獲取我需要使用此查詢的信息:

SELECT 
    st.title, st.body, st.author, 
    b.*, 
    bst.position 
FROM story_template AS st 
     INNER JOIN blanks_story_template AS bst ON st.id = bst.sid 
     INNER JOIN blanks AS b ON bst.bid = b.id 
     ORDER BY bst.position 

它,結果如下:

Result after running query

所以我想知道的是,是否有可能將多個ro ws合成一個?因此,例如上述結果會是什麼樣子:

st.id, title, body, author, b.id, title, description, position 
-------------------------------------------------------------- 
1  title body author 1, title, description, position 
          2, title, description, position 
          3, title, description, position 
2  title body author 1, title, description, position 
          2, title, description, position 
          3, title, description, position 

我已經調查GROUP_CONCAT(),如果所有列將具有值從那時起,我就能夠給他們一個數組分割,將工作。但它並沒有真正幫助我,因爲如果blank.description在一行中爲NULL,那麼我將失去哪個blank.id屬於..

這是可以在查詢中使用,還是必須在發送前解析它它與API?

我很抱歉,如果有什麼似乎模糊,如果你需要我澄清任何事情,我會很樂意這樣做。

+0

可以嘗試更改'INNER JOIN爲B空白ON bst.bid = b.id'到'RIGHT OUTER JOIN空白爲B ON bst.bid = b.id'? –

+0

在PHP中更好地抑制重複值:請參見[this question](http://stackoverflow.com/questions/34751841/return-null-instead-of-repeated-value-in-certain-columns/34752372#34752372) – trincot

+0

@ DarshanMehta它並沒有影響結果。 trincot所以沒有好的方法在SQL中做到這一點? – jzasnake

回答

1

你可以在MySQL中使用用戶變量來判斷一行是否與前一行的story_template相同。您需要更改ORDER BY,以便同一story_template的行在一起。

SELECT IF(id = @last_st, '', id) AS id, 
     IF(id = @last_st, '', title) as title, 
     IF(id = @last_st, '', body) as body, 
     IF(id = @last_st, '', author) AS author, 
     blank_id, blank_title, description, position, 
     @last_st := id 
FROM (
    SELECT 
     st.id, st.title, st.body, st.author, 
     b.id AS blank_id, b.title AS blank_title, b.description, 
     bst.position 
    FROM story_template AS st 
      INNER JOIN blanks_story_template AS bst ON st.id = bst.sid 
      INNER JOIN blanks AS b ON bst.bid = b.id 
      ORDER BY st.id, b.id 
    ) AS x 
CROSS JOIN (SELECT @last_id := null) AS y 
+0

您在第二個'SELECT'中出現了一個錯誤,其中'st.st_id'需要更改爲'st.id AS st_id',而'ORDER BY'中也有相同的錯誤。然而,它並沒有解決問題,它所做的只是添加了story_template的id的另一列。或者我理解這個錯誤? – jzasnake

+0

我將它固定爲只使用'id',並且只添加'b.id'的前綴。 – Barmar

+0

阿哈,很酷!現在它按照問題中的描述工作。那麼這樣做會減少查詢時間,當跳過st.body(這是一個真正的長文本有時)或它仍然加載st.body,但只是隱藏它的結果呢? – jzasnake