私は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
:
これは正しいと思われますが、何らかの理由でフィールドリストエラーのbo.onloanが不明になっています – user6631314
あなたの回答をもう一度校正してもらえますか?私はSQLエラーを取得し続けます。エイリアスの名前がbookidの場合、booknamesの最後に「s」が付いていますか? FROM句の最後に)の後には何か重要な意味がありますか?それはおそらく「s」なのでしょうか?私は数多くの方法を試してきましたが、最近ではエラーが発生しています。(onloan ... 5行目 – user6631314
OK、私は仕事に慣れました。 tはThではなくbでなければなりませんThx! – user6631314