2017-07-07 50 views
0

我有三個表格,作者,書籍和借閱。每位作者有多本書。一本書可能會或不會出現在借用表中。下面是模式:MYSQL/PHP:可以加入一對多的領域?

作者

id|authornamename 

書籍

id|bookname|authorid 

借用

id|bookid|borrowerid|onloan //onloan is a boolean 

每當一本書是借來的,它出現在借用表。但是,只有一些書出現在借用表中。如果曾經借過,他們可以獲得TRUEFALSE

以下查詢每個返回一個逗號delimitied bookids和booknames列表作者列表:

SELECT 
a.*,a.id as `authorid`, bookids,booknames 
from authors `a` 
LEFT JOIN (
    SELECT group_concat(id ORDER BY id ASC) as `bookids`, 
group_concat(bookname ORDER BY id ASC) as `booknames` 
    FROM books 
    GROUP BY authorid 
    ) b ON b.authorid = a.id 
GROUP BY a.id"; 

我怎麼也弄,一個列表的書是否是借來的每本書(因爲在借用表中沒有每本書的條目?我希望onloan的列表具有與書籍相同的條目數量,所以我可以告訴某本書在特定時間是否在瀏覽。如果它從未被借過,我想有一個0的價值 - 即與借來的價值相同,但是Onloan是FALSE

所以如果bookids列表是一樣的東西:

"32,77,84" 

的onloan名單應該是這樣的

"0,1,1" 

1意味着它是onloan(出)和0意味着它是不是onloan (在圖書館)。

我需要onloan列表具有與bookids列表相同數量的元素,所以to和to之間存在1對應的關係,我可以使用索引重新組合書籍數組。

感謝您的任何建議。

回答

1

試試這個:

SELECT 
    aid, 
    group_concat(bookid ORDER BY bookid ASC) AS bookids, 
    group_concat(bookname ORDER BY bookid ASC) AS booknames, 
    group_concat(onloan ORDER BY bookid ASC) AS onloan 
FROM (
    SELECT a.id AS aid, b.id AS bookid, b.bookname AS bookname, IF(bo.onloan IS NOT NULL, bo.onloan, 0) AS onloan 
    FROM authors a 
    LEFT JOIN books b ON b.authorid = a.id 
    LEFT JOIN borrowed bo ON bo.bookid = b.id 
) t 
GROUP BY aid 

通知的IF。這保證你總是得到onloan的結果。

+0

這看起來是正確的,但由於某種原因,我得到未知的列bo.onloan在字段列表中的錯誤 – user6631314

+0

你介意再校對你的答案。我不斷收到一個SQL錯誤。別名是否應該以bookids,booknames結尾? )在FROM子句結束後,是否有任何意義?這應該是's'嗎?我嘗試了很多方法,但不斷收到錯誤,最近接近(onloan ...在第5行 – user6631314

+0

好的,我認爲它有一些變化,在書名後面應該有一個逗號並且在選擇之後子句應該是b,而不是t.TX! – user6631314