4

私は2つのテーブルを持っています:

╔══════════════╦═════════════╗
║ Table: book  ║ Column info ║
╠══════════════╬═════════════╣
║ - id         ║ int, pk     ║
║ - title (128)║ varchar     ║
╚══════════════╩═════════════╝

╔══════════════╦═════════════╗
║Table: author ║ Column info ║
╠══════════════╬═════════════╣
║ - id         ║ int, pk     ║
║ - name (128) ║ varchar     ║
║ - bookId     ║ int, fk     ║
╚══════════════╩═════════════╝

(これは完全に正規化された例ではなく、単純にしようとしていることを私は理解しています。)

それらからデータを収集することは非常に簡単です。

SELECT b.title, a.name FROM book b
INNER JOIN author a ON a.bookId = b.id
WHERE b.id = x

ただし、これにより、作成者ごとに1行が生成されることは明らかです。これは、私が望んでいることではありません。代わりに、私はこのデータ構造を実現しようとしています。

[文字列タイトル、文字列[]作成者(配列)]

1つのクエリでこれを行うことは可能ですか?できれば、作成者の列を1つの文字列に「マージ」しないでください。列自体の内部配列のようなもの。

4

3 に答える 3

2

1つのクエリでこれを行うことは可能ですか?できれば、作成者の列を1つの文字列に「マージ」しないでください。列自体の内部配列のようなもの。

いいえ :)

GROUP_CONCATなどは、スカラー(文字列)の結果を生成します。[標準]SQLには「文字列の配列」データ型はありません。

これは「OK」です

  1. クライアントプログラムは、データ自体を非正規化して1、さらに処理することができます。
  2. 非正規化された文字列は、データの視覚化のためにコマンドライン/テキストクライアントに送信できます。
  3. 正規化された形式は、さらにクエリ2で結果を使用するために必要です。

1さらに処理するための配列の作成は、通常、クライアントで行われ、言語によって異なります。これは、C#/LINQでは簡単なワンライナーです。

2正規化された形式のままにすることで、さらに関係代数演算/最適化を適用できます。データを早期に非正規化すると、広範囲の有効な(そしておそらくより効率的な)クエリプランを排除できます。

于 2013-01-28T19:46:47.263 に答える
1

あなたが欲しいgroup_concat

select b.title,
       group_concat(a.name)
from book b join
     author a
     on b.id = a.bookid
group by b.id, b.title

これにより、すべての作成者がコンマ区切りのリストに入れられます。SEPARATORステートメントを使用して区切り文字を指定できます。

2冊の本が同じタイトルである場合に備えて、私も本IDでグループ化したことに注意してください。

于 2013-01-28T19:41:25.717 に答える
0

これを試して

 SELECT b.title,a.name, concat('[',b.title,',',a.name, ']') as output
 FROM book b 
 INNER JOIN author a
 ON b.id = a.bookid
 GROUP BY b.id, b.title

SQLデモ

于 2013-01-28T19:45:04.797 に答える