创建一个干净的HABTM查询

时间:2014-01-18 15:23:04

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

我一直在努力尝试为MySQL提供干净的HABTM查询

我有以下表格

auth_users

id:1,name:test

auth_groups_users

user_id:1,group_id:1

user_id:1,group_id:2

auth_groups

id:1,name:default_group

id:2,name:another_group

我正拉着一个用户,在结果中我也希望得到这个小组。

问题是如何正确加入... 我是否执行左连接...或常规..我首先加入链接表然后在什么条件下? 接下来是什么?

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

我的开始......

“SELECT * FROM auth_users AS User LEFT JOIN auth_groups_users ON(auth_groups_usersuser_id = Userid) LEFT JOIN auth_groups AS Group ON(Groupid = auth_groups_usersgroup_id)  在Userid ='1';“

这是正确的吗?

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

所以我希望我的结果是:

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

1 个答案:

答案 0 :(得分:2)

忘记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实现自己的方式(这不是什么大问题)