使用Propel 1.6从3个表中检索信息和计数的单个SQL查询

时间:2013-01-10 15:34:59

标签: mysql sql join propel

我有以下(简化)数据库结构:

book

id
title

page

id
bookId
number

figure

id
pageId

page.bookIdfigure.pageId分别是指向主键book.idpage.id的外键。

一本书没有页面,页面也没有数字。

对于指定的图书ID,使用 sql查询,我想检索

  1. 图书信息
  2. 包含各自信息的页面列表
  3. 每页的数字数
  4. 结果的示例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>
    

2 个答案:

答案 0 :(得分: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()最好看一下你生成的类来确定这一点。

答案 1 :(得分: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。