【问题标题】:My MySQL JOIN query only gets data from one table我的 MySQL JOIN 查询只从一张表中获取数据
【发布时间】:2011-07-31 11:44:49
【问题描述】:
SELECT `users`.*
FROM (`users`)
JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
JOIN `albums` ON `albums`.`user_id` = `users`.`id`
JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
WHERE `users`.`id` = 4 

这是我的问题。我在usersusers_profilesalbumsusers_sites 中有数据。目前,我在四个单独的查询中获得了必要的数据,但我想使用JOINs 进行优化。

我的问题是返回的结果集仅包含来自users 表的一行数据(其中id 为4)。这是意料之中的,但我也想要其他表 JOINed 最后。

例如,users_profiles 包含我已确认包含设置为 4 的 user_id 的行。但从未将来自 users_profiles 的行添加到查询中,我所看到的只是来自 users 的内容。

有什么想法吗?其他表的情况相同 - 我已经确认它们应该被正确选择,但我不确定我做错了什么。

感谢您的帮助!

【问题讨论】:

  • 即使没有相册,您是否想要为用户提供行?如果他们没有 users_sites 怎么办?您是否会为一个用户创建多个相册和多个 users_sites?
  • 感谢您的提醒 - 刚刚在没有相册的用户上测试了(工作)版本,它返回 0 行。我已将查询的第 4 行更改为 LEFT JOIN 以保留它。
  • 我问是因为如果您同时允许多个相册和多个 users_sites,那么您可能无法通过此查询获得所需的内容。

标签: mysql join left-join


【解决方案1】:

试试:

SELECT `users`.*, `users_profiles`.*, `albums`.*, `users_sites`.*
FROM (`users`)
JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
JOIN `albums` ON `albums`.`user_id` = `users`.`id`
JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
WHERE `users`.`id` = 4 

您的代码仅从用户表中选择列。

或者,

SELECT *
FROM (`users`)
JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
JOIN `albums` ON `albums`.`user_id` = `users`.`id`
JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
WHERE `users`.`id` = 4 

请注意,不建议选择 *,因为它没有经过优化。只需选择您需要的列。

【讨论】:

  • 谢谢,您的第一个查询效果很好。我将研究优化列选择。
【解决方案2】:
SELECT `users`.*, `user_profiles`.*, `albums`.*, `user_sites`.*
FROM (`users`)
JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
JOIN `albums` ON `albums`.`user_id` = `users`.`id`
JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
WHERE `users`.`id` = 4 

【讨论】:

    【解决方案3】:

    您只能从用户表中选择列;

    SELECT users.*

    更改您的SELECT 语句以包含您要检索的列,以包含所有表中的所有列(受您的查询影响);

    SELECT * FROM `users`
    JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
    JOIN `albums` ON `albums`.`user_id` = `users`.`id`
    JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
    WHERE `users`.`id` = 4 
    

    包含 users_profile 和 users 表中的所有内容;

    SELECT `users`.*, `users_profiles`.* FROM `users`
    JOIN `users_profiles` ON `users_profiles`.`user_id` = `users`.`id`
    JOIN `albums` ON `albums`.`user_id` = `users`.`id`
    JOIN `users_sites` ON `users_sites`.`user_id` = `users`.`id`
    WHERE `users`.`id` = 4 
    

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 2018-01-20
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2019-10-14
      相关资源
      最近更新 更多