0

我正在使用 cakephp 2.1 并编写如下的 sql 语句。

SELECT * FROM industry
LEFT JOIN movie ON movie.industry_id = industry.id
LEFT JOIN (
        SELECT MAX(id) AS TID ,movie_id FROM trailer
        GROUP BY movie_id

      ) AS c ON c.movie_id = movie.id
LIMIT 0, 4;

其中行业是“行业”模型,电影是“电影”模型,预告片是“预告片”模型,我试过这个。

$options['joins'] = array(
        array(
            'table' => 'movies',
            'alias' => 'Movie',
            'type' => 'left',
            'conditions' => array('Industry.id = Movie.industry_id')), 
        array(
            'table' => 'movie_trailers',
            'alias' => 'Trailer',
            'type' => 'left',
            'conditions' => array('Trailer.movie_id = Movie.id')));

    $trailers = $this->Industry->find('all', $options);

所以请建议我将此语句转换为 cakephp 语句。

4

2 回答 2

1

您的 SQL 是join带有 a 的sub query,而 Cake 代码是join唯一的。

您可以进行子查询,但我会寻找一种仅通过连接来完成的方法。

鉴于您的问题缺乏详细信息,我无法提供更好的查询。

于 2013-01-03T12:32:24.443 回答
1

很难说出您要通过查询来完成什么。但看起来您真正想要的是有关四个最新预告片的信息。

既然如此,您总是可以将其全部放入连接中:

$records = $this->Industry->find('all', array(
    'fields' => array('Trailer.id', 'Industry.id', 'Industry.Name', 'Movie.id', 'Movie.name'),
    'limit' => 4,
    'joins' => array(
        array(
            'table' => 'movies',
            'alias' => 'Movie',
            'type' => 'LEFT',
            'conditions' => array(
                'Movie.industry_id = Industry.id'
            ),
        ),
        array(
            'table' => '(SELECT MAX(id) As id, movie_id FROM trailers GROUP BY movie_id)',
            'alias' => 'Trailer',
            'type' => 'LEFT',
            'conditions' => array(
                'Trailer.movie_id = Movie.id'
            ),
        ),
    ),
));

由于在连接表中抛出查询,它会破坏 ORM 的可移植性,但它可以工作。

这是另一个可能有用的问题:CakePHP and subquery

于 2013-01-16T05:21:52.993 回答