【问题标题】:Creating a clean HABTM query创建一个干净的 HABTM 查询
【发布时间】:2014-01-18 15:23:04
【问题描述】:

我一直在努力尝试为 MySQL 获取一个干净的 HABTM 查询

我有以下表格

auth_users

id:1,名称:测试

auth_groups_users

user_id: 1,group_id: 1

user_id: 1,group_id: 2

auth_groups

id:1,名称:default_group

id:2,名称:another_group

我正在拉一个用户,在结果中我也想获得组。

问题是我如何正确加入它... 我是执行左连接……还是常规……我是先加入链接表,然后再加入什么条件? 那么接下来呢?

谢谢,如果您需要更多信息,请告诉我。

我的开始...

"从auth_users 选择 * 作为User 左连接auth_groups_users ON (auth_groups_users.user_id = User.id) 左连接 auth_groups AS Group ON (Group.id = auth_groups_users.group_id) 在哪里User.id='1';"

这是正确的吗?

然后我还想在用户中将组分组到它自己的结果中......而不是同一用户的多个结果......

所以我希望我的结果是:

 array(
     'id' => 1,
     'name' => 'test',
     'Groups' => array(
           0 => array(
                'id' => 1,
                'name' => 'default_group'
           ),
           1 => array(
                'id' => 2,
                'name' => 'another_group'
           )
      )
 ) 

【问题讨论】:

    标签: php mysql has-and-belongs-to-many


    【解决方案1】:

    忘掉HABTM吧,那些学术上的东西在现实生活中是一种垃圾,尽管你可能需要在未来(或者现在)回答这个问题。

    所以让我澄清一下,你有这些表

    users    group_users    groups
    -----    -----------    ------
    id       user_id        id
    name     group_id       name
    

    所以基本上你想要做的是选择用户并将他们的组与他们一起列出,对吗?

    所以正确的查询应该是

    SELECT users.name, groups.name
    FROM users
    INNER JOIN groups_users ON users.id = group_users.user_id
    INNER JOIN groups ON groups.id = group_users.group_id
    

    但是,这只会列出拥有组的用户,如果您还想选择没有组的用户,您应该执行左连接而不是内连接(第一个)。

    我想不出一个真正直接的方法来获得你想要的,因为数据库总是会返回一组行。你有两种方法来实现你想要的

    1. 使用 MySQl 的 GROUP_CONCAT
    2. 通过 PHP 实现自己的方式(这没什么大不了的)

    【讨论】:

    • 嘿,这正是我所需要的,感谢您的解释。我试过你的方法,这就是为什么我最后改变了帖子。但是我使用了您的查询(WHERE User.id = 1),这很好,但是如果我的用户在多个组中,我会得到多个结果(行)。我想将“组”表的结果与适当的用户分组。
    • 所以你想要一个组列表和里面的用户或者...?
    • 我需要一个查询结果,其中用户包含属于该用户的所有组的数组..
    • 有点像这样: User = array('id' => 1,'name' => 'test','Groups' => array(0 => array('id' => 1 ,'name' => 'default_group'),array(1 => array('id' => 2,'name' => 'another_group'))))
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多