2016-06-13 13 views
0

どのように私はONEクエリで1対多関係のデータを取得することができますか?1つのクエリでMySQLと1対多の関係

例:1冊の著者には多くの著者がいます。

結果の戻りは運

SELECT *, (
    SELECT * 
    FROM authors 
    WHERE book_id = b.id 
) AS authors 
FROM book b; 

MySQLエラー「オペランドが1列(複数可)を含まなければならない」結果を選択するために、サブクエリを使用してではなく、試してみましたが何この

array(
    'book_title' => 'HTML for Dummies', 
    'book_desc' => '...', 
    'authors' => array(
     [0] => array(
      'name' => 'Someone', 
      'dob' => '...' 
     ), 
     [1] => array(
      'name' => 'Someone', 
      'dob' => '...' 
     ) 
    ) 
) 

ようにする必要があります1つの列しか選択できないことを意味します。

あなたは私があなたに示したように返信結果の形式をアーカイブする方法を教えてもいいですか?

+0

最初の 'SELECT * 'の後にカンマがあります – 1000111

+0

SQLは1つのクエリからネストしたテーブルを返すことを望んでいますか?もしそうなら、私はあなたが失望するつもりであると思います。単一の問合せでは、単一のフラット・テーブルのみを戻すことができます。ただし、テーブルに参加してPHPを使用して結果を必要な配列形式に処理することができます – ADyson

+0

@ADysonありがとうございます。私はもっ​​と良い解決策を模索しようとしています。 –

答えて

0
SELECT 
B.id AS book_id, B.name AS book_name, 
A.name AS author_name ,A.ID AS author_id 
FROM book B 
LEFT JOIN 
author A ON B.id = A.book_id; 

参照してください:http://sqlfiddle.com/#!9/633cfa1/2

あなたの出力は、数値配列になります。

Array 
(
    [0] => Array 
     (
      [bookId] => 1 
      [bookName] => Book 1 
      [authorId] => 1 
      [authorName] => Author 1 
     ) 

    [1] => Array 
     (
      [bookId] => 1 
      [bookName] => Book 1 
      [authorId] => 2 
      [authorName] => Author 2 
     ) 

    [2] => Array 
     (
      [bookId] => 2 
      [bookName] => Book 2 
      [authorId] => 3 
      [authorName] => Author 3 
     ) 

    [3] => Array 
     (
      [bookId] => 3 
      [bookName] => Book 3 
      [authorId] => 4 
      [authorName] => Author 4 
     ) 

) 

multideimentional配列に、この配列を変換し

Array 
(
    [0] => Array 
     (
      [bookId] => 1 
      [bookName] => Book 1 
      [authorName] => Array 
       (
        [0] => Author 1 
        [1] => Author 2 
       ) 

     ) 

    [1] => Array 
     (
      [bookId] => 2 
      [bookName] => Book 2 
      [authorName] => Array 
       (
        [2] => Author 3 
       ) 

     ) 

    [2] => Array 
     (
      [bookId] => 3 
      [bookName] => Book 3 
      [authorName] => Array 
       (
        [3] => Author 4 
       ) 

     ) 

) 

参照してください:あなたは、それが迅速かつ簡単に行いたい場合は、https://3v4l.org/q1dli

+0

ありがとうzakhefron!これは便利です〜だけですべての人に適用することができるユーティリティ関数にそのPHPスクリプトを作る必要があります。 –

0
SELECT b.*, a.* 
FROM book b 
INNER JOIN authors a ON (a.book_id = b.id); 
0

mysqlからデータを簡単に取得できないようにする方法。 Mysqlは行ごとに戻ります。だから本や著者は結果セットで繰り返すだろう。それに応じて配列を準備するためにmysqlの結果を解析する必要があります。

以下を試してください:

1)筆者がカンマで区切られたすべての書籍。

"SELECT B.*,group_concat(a.id) as authors 
From book b inner join authors as a on b.author_id=a.id 
group by b.id;" 

2)書籍の詳細をすべて著者:

"SELECT A.*,group_concat(B.id) as books 
From book B inner join authors as A on B.author_id=A.id 
group by A.id;" 
+0

ありがとうPiyush〜次のクエリはまだ著者情報を取得するために2番目のクエリを実行するために2番目のクエリを実行する必要があります –

0

を適切な区切り文字でGROUP_CONCATを使用しています。次に、結果として得られる連結された文字列フィールドをPHPアプリケーション(または使用している言語)に分割して、必要な内部配列を素早く取得します。

これは、出力に1本の本が1行しかないという利点があります。