2013-01-10 82 views
3

我有以下(簡化的)數據庫的結構:單SQL查詢來檢索信息,並與行走從3個表計數1.6

book

id 
title 

page

id 
bookId 
number 

figure

id 
pageId 

page.bookIdfigure.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。

編輯:這是我(簡化)推進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> 

回答

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()它可以更好地看到你生成的類是肯定了這一點。

+0

謝謝。我嘗試了類似的東西,但是我收到錯誤「書桌上的未知關係圖」。這是因爲Book和Figure對象之間沒有定義直接的關係,而'leftJoin(Book.Figure)'失敗。我添加了schema.xml以供參考。 –

+0

它似乎是'Page.Figure'。試一試。 – j0k

+0

太棒了,那就是訣竅! –

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) - 我改變了其中的一個,以45

+0

謝謝,這可以幫助我的任務。我也改變了我的問題中的頁面ID。 –