CakePHP 2.9 连接查询返回错误结果

Posted

技术标签:

【中文标题】CakePHP 2.9 连接查询返回错误结果【英文标题】:CakePHP 2.9 join query returning wrong result 【发布时间】:2019-08-20 07:04:56 【问题描述】:

我正在使用以下(有效的)mysql 查询来获取 collection_keyword 的所有 collection_items 的计数

SELECT ck.id
     , ck.working_title
     , count(*) as matches 
  FROM collection_keywords ck
  JOIN collection_keywords_collection_items ckci 
    ON ckci.collection_keyword_id = ck.id
  JOIN nl_collection_items nci 
    ON nci.id = ckci.collection_item_id
 GROUP 
    BY ck.id

SQL 小提琴:http://sqlfiddle.com/#!9/7b4b0a/1

返回以下信息

+----+---------------+---------+
| id | working_title | matches |
+----+---------------+---------+
|  1 | First Title   |       5 |
|  2 | Second Title  |      10 |
|  3 | Third Title   |      15 |
+----+---------------+---------+

我正在尝试使用 Cakephp 2.9 复制此查询,但使用 join 方法

结果返回空

这是我的 CakePHP 代码

$collectionKeywords = $this->CollectionKeyword->find('all', array(
    'contain' => array(),
    'fields' => array('CollectionKeyword.id, CollectionKeyword.working_title', 'count(*) AS matches'),
    'joins' => array(
        array(
            'table' => 'collection_keywords_collection_items',
            'type' => 'INNER',
            'conditions' => array(
                'collection_keywords_collection_items.collection_keyword_id' => 'CollectionKeyword.id'
            )
        )
    ),
    'group' => 'CollectionKeyword.id',
));

关系定义如下

class CollectionKeyword extends PluginCollectionKeyword

    public $hasAndBelongsToMany = array(
        'CollectionItem' => array(
            'className' => 'CollectionItem',
            'joinTable' => 'collection_keywords_collection_items',
            'foreignKey' => 'collection_keyword_id',
            'associationForeignKey' => 'collection_item_id',
        )
    );

还有CollectionItem关系

class CollectionItem extends PluginCollectionItem


    public $hasAndBelongsToMany = array(
        'CollectionKeyword' => array(
            'className' => 'CollectionKeyword',
            'joinTable' => 'collection_keywords_collection_items',
            'foreignKey' => 'collection_item_id',
            'associationForeignKey' => 'collection_keyword_id',
        ),

    );

【问题讨论】:

添加了 SQLFiddle。谢谢@草莓 (实际上,在这种情况下可能不需要,但无论如何+1) 你使用的是哪个版本的 Cakephp? 我使用的是 2.9.8 【参考方案1】:

我在您的代码中发现了一些问题:

    Join 的数组键应该是joins。你用过join

    第二个内连接的条件缺失。

这是有效的代码。

 $collectionKeywords = $this->CollectionKeyword->find('all', array(
    'contain' => array(),
    'fields' => array('CollectionKeyword.id, CollectionKeyword.working_title', 'count(*) AS matches'),
    'recursive' => -1,
    'joins' => array(
        array(
            'table' => 'collection_keywords_collection_items',
            'type' => 'INNER',
            'conditions' => array(
                "collection_keywords_collection_items.collection_keyword_id = CollectionKeyword`.id"
            )
        ),
        array(
            'table' => 'collection_items',
            'type' => 'INNER',
            'conditions' => array(
                "collection_items.id = collection_keywords_collection_items.collection_item_id"
            )
        ),        
    ),
    'group' => 'CollectionKeyword.id',
    ));

它产生以下查询

SELECT CollectionKeyword.id, CollectionKeyword.working_title, count(*) AS matches FROM `collection_keywords` AS `CollectionKeyword` INNER JOIN `collection_keywords_collection_items` ON (`collection_keywords_collection_items`.`collection_keyword_id` = `CollectionKeyword`.`id`) INNER JOIN `collection_items` ON (`collection_items`.`id` = `collection_keywords_collection_items`.`collection_item_id`) WHERE 1 = 1 GROUP BY `CollectionKeyword`.`id`

根据您使用的 Cakephp 版本,您可以使用 code 验证上次运行的查询。

【讨论】:

感谢您的回答!它也可以在没有第二次连接的情况下工作,因为我不需要该表中的任何数据,我现在看到我在连接条件中使用了数组表示法,这是错误的。 @Notflip 如果它解决了您的问题,请接受答案。

以上是关于CakePHP 2.9 连接查询返回错误结果的主要内容,如果未能解决你的问题,请参考以下文章

python 连接数据库,查询结果写入数据到excel

MySql数据库增删改查常用语句命令

大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)

使用连接语句和子查询准备 CakePHP 查询

jsp连接mysql数据库后增删改查怎么写

Cake PHP 连接查询以关联数组形式返回