2017-07-07 5 views
0

私は3つのテーブル、著者、本を持ち、借りています。著者ごとに複数の書籍があります。そして、借用されたテーブルには本が表示される場合と表示されない場合があります。ここではスキーマは次のとおりです。MYSQL/PHP:1対多数のフィールドに参加できますか?

著者

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

本が借りているときはいつでも、それは借りテーブルに表示されますを借用

id|authornamename 

ブックス

id|bookname|authorid 

。ただし、一部の書籍のみが借用テーブルに表示されます。これまでに借りたことがあった場合、彼らはTRUEまたはFALSEの値を持つことができます。

次のクエリは、各によってbookidsとbooknamesのカンマdelimitiedリストと著者のリストを返します。

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フィールド)、借用テーブルに各書籍のエントリがないことを前提にしていますか?私はonloanのリストに本と同じ数のエントリーを持たせたいので、ある時間に本がオンランであるかどうかを知ることができます。一度も借りたことがなければ、私は値0を持っています。つまり、借りていたのと同じ値ですが、OnloanはFALSEでした。

bookidsリストのようなものであれば:

"32,77,84" 

onloanリストは

1は、それが(アウト)onloanであり、0はそれがonloanないことを意味を意味
"0,1,1" 

のようなものでなければなりません(図書館で)。

bookinsリストと同じ数の要素を持つためにはonloanリストが必要です。toとI can lasterの間には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

答えて

1

はこれを試してみてください。これにより、onloanの結果が常に得られることが保証されます。

+0

これは正しいと思われますが、何らかの理由でフィールドリストエラーのbo.onloanが不明になっています – user6631314

+0

あなたの回答をもう一度校正してもらえますか?私はSQLエラーを取得し続けます。エイリアスの名前がbookidの場合、booknamesの最後に「s」が付いていますか? FROM句の最後に)の後には何か重要な意味がありますか?それはおそらく「s」なのでしょうか?私は数多くの方法を試してきましたが、最近ではエラーが発生しています。(onloan ... 5行目 – user6631314

+0

OK、私は仕事に慣れました。 tはThではなくbでなければなりませんThx! – user6631314

関連する問題