MYSQL:从每个行的其他表中选择多个记录

时间:2014-06-26 04:05:52

标签: php mysql sql

我有3个表 - 用户,项目和关系(每个用户有超过1个项目):

USERS:

user_id | user_name

1       | Alex
2       | John
3       | Louis

ITEMS:

item_id | item_name

1       | Item 1
2       | Item 2
3       | Item 3

关系:

item_id | user_id

1       | 1
2       | 1
1       | 2
3       | 2
2       | 3
3       | 3
3       | 1

等。

所以我需要一个查询,我可以让所有用户(这很容易)包含每个用户的所有项目(这更疯狂)。

因此,我需要这样的事情:

[1] => (
   'name' => Alex, 
   'items' => (
      [1] => (
         'name' => 'item 1'
      )
      [2] => (
         'name' => 'item 2'
      )
   )
)
[2] => (
   'name' => John, 
   'items' => (
      [1] => (
         'name' => 'item 1'
      )
      [2] => (
         'name' => 'item 3'
      )
   )
)

我一直在玩JOIN几个小时,但仍然无法进入。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

为了获得你想要的结果,你必须在PHP中对数据进行一些操作,因为MySQL不会返回多维数组。您可以使用联接来获取您之后的数据:

SELECT
    users.user_name,
    items.item_name
FROM users
LEFT JOIN relations 
    ON relations.user_id = users.user_id
LEFT JOIN items 
    ON relations.item_id = items.item_id

这应该会返回如下结果:

user_name | item_name
Alex        Item 1
Alex        Item 2
Alex        Item 3

等。然后使用PHP将其分组:

$grouped = array();
foreach($your_database_results as $row) {
    $username = $row['user_name'];
    if(!array_key_exists($username, $grouped))
        $grouped[$username] = array();
    $grouped[$username][] = $row['item_name'];
}

然后你的print_r($grouped)应该看起来与你的示例类似(我已经将名称用作数组键而不是第一个数组条目,其中包含以下值 - 很容易转换)。