2017-03-21 53 views
1

自從我與MySQL一起工作已經有一段時間了,我無法自己弄清楚這一點:我有三個表格,一個用於users,一個用於books另一個用於favourites。我正在開發一個搜索系統,用戶可以根據其標題,發佈年份或流派來搜索圖書。MySQL - 根據關係表的值在最終輸出中添加額外的列

booksusers表沒有什麼特別的想法,所以我認爲發佈這兩個表的模式都沒有關係。 favourites表是由book_id和user_id兩個列組成的兩個foreign key列的關係表。

我的目標是運行一個基於搜索查詢獲取所有圖書的查詢,但也會查找favourites表,如果用戶已將特定圖書添加到他/她的收藏夾中,則會在最後添加一列輸出,fe isFavorable: 0,否則:isFavorable: 1。最後的結果將是這個樣子(在JSON格式):

{ 
    data: [ 
    { 
     // non favorite 
     "id": 1, 
     "title": "Test Book 1", 
     "genre": "Adventure", 
     "year": 1994, 
     "isFavorite": 0 // if cannot be found in the favourites table 
    }, 

    // favorite 
    { 
     "id": 2, 
     "title": "Test Book 2", 
     "genre": "Novel" 
     "year": 2012, 
     "isFavorite": 1 // if can be found in the favorites table 
    } 
    ] 
} 

到目前爲止,我只能夠輸出所有標記爲收藏的結果,而不是所有的書籍和想不通如何檢查它是否已被標記爲收藏並輸出對應值。

這將打印所有的書用戶#1喜歡

SELECT * FROM books b 
LEFT JOIN favourites f ON f.book_id = b.id 
LEFT JOIN users u ON u.id = f.user_id 
WHERE u.id = 1 
+0

'LEFT JOIN'應該是'RIGHT JOIN'? – kittykittybangbang

回答

2

我會嘗試:

SELECT 
b.id 
, b.title 
, b.year 
, b.genre 
, IF(f.book_id IS NOT NULL, 1, 0) AS isFavorite 
FROM books b 
LEFT JOIN favourites f ON f.book_id = b.id AND f.user_id = 1 
WHERE 
... e.g. b.year = 3099 AND b.genre = 'Sport' 
  1. 刪除users表,因爲你只需要user_idfavorites
  2. 將條件從WHERE條款移至ON條款,因爲您還希望h AVE的(還)沒有喜歡的書
  3. 使用IF聲明以確定您的用戶已經喜歡這本書
+0

謝謝,這正是我所需要的。隊友的歡呼聲 :) –

相關問題