3

次の(簡略化された)データベース構造があります。

テーブルbook

id
title

テーブルpage

id
bookId
number

テーブルfigure

id
pageId

page.bookIdandは、それぞれ主キーandfigure.pageIdを指す外部キーです。book.idpage.id

本にページがなくても、ページに図がなくてもかまいません。

指定された書籍 ID について、単一のSQL クエリで取得したい

  1. 書籍情報
  2. それぞれの情報を含むページのリスト
  3. 各ページの図の数

結果の JSON 表現の例は次のとおりです。

{
    "id": 34, 
    "title": "The title"
    "pages": [
    {
        "id": "44",
        "number": 1
        "figureCount": 2
    },
    {
        "id": "45",
        "number": 2
        "figureCount": 5
    },
    ...
    ]
}

Propel 1.6 でそれは可能で、結果の SQL クエリはどうなるでしょうか?

MySql 5.0 を使用しています。

編集: これは私の (簡略化された) Propel schema.xml です:

<table name="book" phpName="Book">
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="title" type="varchar" size="512" required="true" />
</table>

<table name="page" phpName="Page" >
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="book_id" type="bigint" required="true" />
    <column name="number" type="integer" required="true" />
    <foreign-key foreignTable="book" phpName="Book" refPhpName="Page" onUpdate = "cascade" onDelete = "cascade">
       <reference local="book_id" foreign="id" />
    </foreign-key>
</table>

<table name="figure" phpName="Figure">
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="page_id" type="bigint" required="true" />
    <foreign-key foreignTable="page" phpName="Page" refPhpName="Figure" onUpdate = "cascade" onDelete = "cascade">
       <reference local="page_id" foreign="id"/>
    </foreign-key>
</table>
4

2 に答える 2

5

@ user1073631からのすばらしい回答によると、推進クエリは次のようになります。

$books = BookQuery::create()
  ->select(array('Book.Id', 'Book.Title', 'Page.Id', 'Page.Number'))
  ->withColumn('count(Figure.ID)', 'FigureCount')
  ->leftJoin('Book.Page')
  ->leftJoin('Page.Figure')
  ->groupBy('Book.Id')
  ->groupBy('Book.Title')
  ->groupBy('Page.Id')
  ->groupBy('Page.Number')
  ->find();

join()生成されたクラスを見て、その点を確認したほうがよいかどうかはわかりません。

于 2013-01-10T16:37:36.853 に答える
3

私はその ORM を使用したことはありませんが、あなたがやろうとしていることをサポートしないとは想像できません。これはあなたが探しているSQLですか?

SELECT 
  B.Id,
  B.Title,
  P.Id as PageId,
  P.Number,
  COUNT(F.Id) as FigureCount
FROM 
  Book B
    LEFT JOIN Page P ON B.Id = P.BookId
    LEFT JOIN Figure F ON P.Id = F.PageId
GROUP BY 
  B.Id,
  B.Title,
  P.Id,
  P.Number

そして、ここにSQL Fiddleがあります。

注: 両方のページ オブジェクトが同じ ID (44) を持つことを意図していたとは思いません。そのうちの 1 つを 45 に変更しました。

于 2013-01-10T16:15:56.577 に答える