SQL - 从多个表(一对多)中提取用户的所有信息

时间:2011-05-10 16:56:18

标签: php mysql sql

对不起标题,我不知道还能放什么。

我希望在单个数据库查询中提取用户的所有信息。

共有4个表:

user  
  - userid (PK)
services
  - serviceid (PK)
languages
  - langid (PK)
areas
  - areaid (PK)
user_services
  - user_services_id (PK)
  - serviceid (FK)
  - userid (FK)
user_languages
  - user_lang_id (PK)  
  - langid (FK)
  - userid (FK)
user_areas
  - user_area_id (PK)
  - areaid (FK)
  - userid (FK)

useruser_services我可以一起完成,因为它们各有一行,并由user.id链接。

user_languagesuser_areas表是一对多表,看起来类似于:

user_lang_id  |  userid  |  langid
      1       |     5    |     2
      2       |     5    |     6
      3       |     5    |    18

user_area_id  |  userid  |  areaid
      1       |     5    |    15
      2       |     5    |     4
      3       |     5    |    13

我希望数组看起来像这样:

Array
(
    [id] => 5
    [firstname] => lethal    
    [surname] => Mango
    [gender] => male
    ...
    [langid] => 2
    [langid] => 6
    [langid] => 18
    ...
    [areaid] => London
    [areaid] => Birmingham
    [areaid] => Manchester
}

我尝试过组合SQL JOIN,但似乎并没有走得太远。我最后的办法是做3个单独的查询,并在最后加入PHP数组(超级凌乱)。

谢谢:)

1 个答案:

答案 0 :(得分:1)

如果您向我们提供表的结构,我们可以为您提供更多帮助,但只要所有表共享一个外键,您就可以使用JOIN。它不必是相同的关键字段(例如user_id),但这确实使它更直接。有了连接,你应该有这样的东西:

select * from user
left join user_services on user_services.id = user.id
left join user_languages on user.id = user_languages.id
left join user_areas on user.id = user_areas.id

这将为您提供一个包含所有所需列的虚拟表。然后,您可以使用以下所需的数据从这些列创建数组:

foreach($query_result as $field => $value) {
    $user[$field] = $value;
} 

*注意 - 代码样本未经测试,仅用于样本目的。