DISTINCT无法在连接查询Cakephp中工作

时间:2013-07-20 23:28:07

标签: cakephp cakephp-2.0 distinct cakephp-2.1

我正在开发一个Cakephp 2.x我是cakephp的新手,并且很难掌握蛋糕查询方法我实现了一个连接查询但是这里不同的是我的代码

我想要实现的目标:

我有一个表名消息,其中字段 Message.mobileNo 中有重复的数字...我只想选择不同的数字,然后在基础上我正在比较或加入联系人表中的那些不同数字,其中有mobileNo,workNo等字段,并检查这些数字是否在联系人表格中...如果他们抓住联系人姓名对我来说..希望你理解

所以我所做的就是......我正在尝试将联系人表的行与消息表中的数据分开...

function getRecentMessages($userid){
    $this->bindModel(array(
        'belongsTo' => array(
            'Contact' => array(
                'className' => 'Contact',
                'foreignKey' => false,
                'conditions' => array(



                    'AND' =>
                    array(
                        array('OR' => array(
                            array('Message.mobileNo = Contact.mobileNo'),
                            array('Message.mobileNo = Contact.workNo'),
                            array('Message.mobileNo = Contact.homeNo'),
                            array('Message.mobileNo = Contact.other'),
                        )),


                    )


                ),
                'type' => 'LEFT',
                'order'=>'Message.idTextMessage DESC',


            )
        )
    ), false);

    return $this->find('all', array('conditions' => array('Message.User_id' => $userid),
            'contain' => array('Contact' ),
        'fields' => array(' DISTINCT Message.mobileNo',//distnct not working 
            'Contact.mobileNo',
            'Contact.workNo',
            'Contact.homeNo',
            'Contact.other',
            'Contact.name',
            'Message.dateTime',
            'Message.type',
            'Message.body'),

        'limit' => 6));


}

我试过这个

DISTINCT (Message.mobileNo) as mobileNo

但也没有工作

我试过了

     'group' => 'Message.mobileNo',   

通过使用它可以工作,但然后查询没有得到所需的结果..我的意思是DESC条件不起作用

1 个答案:

答案 0 :(得分:3)

SQL Server中的

DISTINCT适用于从结果集返回的整行。因此,如果您的数据包含,例如:

mobileNo workNo homeNo name     ... 
1234     1234   5678   Joe      ...
1234     867    5309   Stacy    ...  
1        555    5555   Sentinel ...         

您的DISTINCT不会删除Joe或Stacy,因为整行不相等。另一方面,如果您的数据包含:

mobileNo workNo homeNo name     ... 
1234     1234   5678   Joe      ...
1234     1234   5678   Joe      ...
1234     1234   5678   Joe      ...
1234     1234   5678   Joe      ...
1234     1234   5678   Joe      ...
1234     867    5309   Stacy    ...  
1        555    5555   Sentinel ...

您的查询只返回一个名为" Joe"的条目,因为它只会返回结果集中的不同行。

您应该知道DISTINCT通常是我认为SQL中的anti-pattern。它通常是SQL的证据,经过修改后可以产生作者认为正确的结果,但查询并不能真正代表他们的意图。

所以我必须问你,你在查询中添加DISTINCT的目标是什么?或者,更好的是,想象一下,如果要求您仅返回下表中的不同mobileNo

mobileNo workNo homeNo name     ... 
1234     1234   5678   Joe      ...
1234     867    5309   Stacy    ...  
1        555    5555   Sentinel ...         

如果您是SQL数据库,哪一行不会返回?你会拒绝Stacy或Joe吗?这是您的DISTINCT查询的基本问题 - 数据库无法知道您要排除哪一行。根据您提供的信息,它不能仅返回不同的mobileNo,因为具有不同名称但相同mobileNo的两行同样有效,可以排除。

X-Y问题

那么,问问自己,你真的试图解决什么问题?我怀疑你的帖子是什么称为X-Y问题的一个主要例子。 Here is a link我遇到过这个问题的最好例子,我已经在下面复制了它:

  

这是什么?

     

XY problem询问您尝试的解决方案而不是您的实际问题。

     

也就是说,您正在尝试解决问题X,并且您认为解决方案Y会起作用,但是当您遇到麻烦时,不要询问X,而是询问{ {1}}。

     

问题

     

这可能会让那些试图帮助您解决问题的人感到沮丧,因为当您提出问题时,您需要帮助的解决方案可能与您尝试解决的问题没有任何明显的联系

     

如何避免

     

为避免陷入此陷阱,请始终包含有关更广泛图片的信息以及任何尝试的解决方案。如果有人要求提供更多信息,或者特别是更具体的问题,请提供详细信息。如果您认为有其他解决方案会被建议并且您已经排除了这些解决方案,那么请不要试图避免重新审视它们 - 而是说明您为什么要将它们排除在外,因此提供有关您的要求的更多信息,并帮助其他人提供更好的答案。

     

示例

     

最近的IRC对话说明:

     
     
    

< Q>是否有函数在两个分隔符之间返回一个字符串?

         

< B个我不明白你的意思,但我怀疑它已经是一个功能

         

&LT c取代;分割和切片

         

&LT d取代;分区

         

< Q>我试过分区
    < Q>我试图使用内置函数来获取字符串之间的数字#34; attribute1:50.223,attribute2:442.1"

         

&LT d取代;为什么不解析字符串?

         

< Q>我以为可能有一些内置的解析内容

         

&LT d取代; pair = [x.strip()for x in s.split(",")]; attribs = {k:对于k成对的x对于k,对象在x.split中(":")}     &LT d取代;有一些库,但简单的格式很容易 - 如果你不关心错误处理
    &LT d取代;改变源以使用众所周知的格式,例如json或yaml,在可能的情况下是首选

         

< Q>这段代码实际上来自HTML
    < Q>但我不知道如何使用HTMLParser解析Javascript或其他任何名称

         

&LT d取代;它只是嵌入在html中,还是一些受损的html版本?

         

< Q>它嵌入在HTML

中          

&LT d取代;如果是javascript(也就是说,除了缺少外括号),json可能会解析它

         

< Q>谢谢

         

&LT d取代;我没有明确说出来:json只解析数据结构,而不是js代码

         

< Q>我需要解析的只是一个数据结构

  
     
     

问题实际上是关于如何解析Javascript数据结构,而不是找到两个分隔符之间的字符串"但是它需要相当多的时间和直觉来解决真正的问题。

     

这在完全互动的聊天中更容易(无论采用何种模式),但在SE网站上,稍微打磨帖子,发布帖子,然后在反馈之前有5-30分钟或更长时间,从一开始就朝着正确的方向前进是非常有帮助的。

我相信根据您的查询,您实际上并未尝试查找数据库的不同Y,因为您在查询中包含了所有其他数据。那么你真正试图完成什么?