【问题标题】:SQL - Pulling all information on a user from multiple tables (one to many)SQL - 从多个表中提取用户的所有信息(一对多)
【发布时间】:2011-05-11 21:08:00
【问题描述】:

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

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

有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 数组连接在一起(超级混乱)。

谢谢:)

【问题讨论】:

    标签: php mysql sql


    【解决方案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;
    } 
    

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

    【讨论】:

    • 已添加更多详细信息 :) 希望对您有所帮助
    • 从外观上看,Join 应该仍然可以工作。只需将 userid 字段上的所有内容与 users.id 字段连接即可。
    • 不幸的是,当实际分别有 3 和 5 个时,仍然只提取第一个 languageid 和 areaid
    • 您是否在 MySQL 中运行查询以确保您没有意外限制查询?标准联接应返回符合条件的所有内容。您也可以尝试左连接(请参阅编辑后的答案),但只要填写了字段,它就应该在没有左连接的情况下拉动它们。
    • 谢谢 - 我今晚回来时会试试的。我会让你知道我是怎么过的:)
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2015-03-23
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多