【问题标题】:Join query explained加入查询解释
【发布时间】:2011-07-20 04:43:18
【问题描述】:

对于用户订阅的返回用户,我有以下联接查询。 users 表包含一个用户的数据,subscriptions 表包含一个user_idfollowing 列中她/他订阅的用户的id。

SELECT  subscriptions.following, users.first_name, last_name 
FROM (
subscriptions
)
JOIN users ON  users.user_id =  subscriptions.following
WHERE  subscriptions.user_id = 62
ORDER BY subscribed DESC 
LIMIT 0 , 30

我得到如下表结构

+-----------+-------------+------------+
| following | first_name  | last_name  |
+-----------+-------------+------------+
| 11        | Dave        | Green      |
| 2         | Anna        | Blue       |
+-----------+-------------+------------+

有人可以确认我的查询是否正确吗?我不明白在连接查询中为什么我必须指定FROM,而我已经告诉我在SELECT 部分中使用了哪些表。

注意:查询有效。我只是不确定是否有更好的方法。

【问题讨论】:

  • 您需要FROM 子句,以便数据库知道要从哪些表中选择,在您的情况下为subscriptions JOIN users。这里不需要围绕订阅的括号。
  • 谢谢!我很困惑,因为我也是从users 中选择的。那么为什么查询在没有指定users 以及FROM 的情况下工作?
  • 它确实指定了它。 FROM 部分是 FROMWHERE 之间的所有内容:subscriptions JOIN users ON users.user_id = subscriptions.following
  • 所以,你基本上说:获取所有行组合FROMsubscriptionsusers,但根据ON(加入)条件限制结果。
  • 很好的解释,谢谢!

标签: mysql database database-design


【解决方案1】:

您必须了解,数据库不能直接通过从上到下的查询来工作。在处理连接和 where 子句以及任何 group by 子句等之前,它不能执行 SELECT 部分。您也不需要实际在 SELECT 中连接每个表的数据。例如,您可能想要一个员工用户列表(而不是客户)。因此,除了用户表中的内容之外,您不需要任何东西,并且使用连接只是为了将记录集减少到仅在雇员表中的记录集。无需从员工表中选择任何字段。数据库也不会知道,直到您到达连接时您希望如何组合数据。您将在同一张表上获得这些连接条件的不同记录:

FROM subscriptions 
JOIN users ON users.user_id =  subscriptions.following 

FROM subscriptions 
left JOIN users ON users.user_id =  subscriptions.following 

FROM subscriptions 
CROSS JOIN users

FROM subscriptions 
JOIN users ON users.referred by_id =  subscriptions.following 

第一个将为您提供两个表中的记录。

第二个会为您提供第一个表中但不一定在第二个表中的记录。根据数据,这可能是相同数量的记录,也可能是显着不同的记录数量。

第三个会将第一个表中的所有记录与第二个表中的所有记录匹配。

第四个会给你推荐用户的人的所有订阅,而不是用户的订阅(是的,我知道这是一个组成的字段,但有些表确实有多个可能的字段,它们可以加入SQL 必须考虑到这一点)。

希望你能从解释中看出为什么需要在FROM子句中指定join。

【讨论】:

  • 这是一个绝妙的解释!谢谢!我正在使用第一个联接进行查询,left join 似乎也可以正常工作,但在正确的表中总会有匹配项。
【解决方案2】:

检查以下内容。 - 你的查询也很好。

SELECT  subscriptions.following, users.first_name, users.last_name 
FROM subscriptions
JOIN users ON users.user_id =  subscriptions.following AND subscriptions.user_id = 62
ORDER BY subscribed DESC 
LIMIT 0 , 30

1.subscriptions旁边select是指定字段父表。例如,如果您在两个表上具有相同的字段名称,则使用父名称作为参考。

2.如果使用静态值检查,则不需要。

【讨论】:

  • 谢谢!我注意到您为每个字段指定了父级。为什么不添加一次父表并用逗号分隔字段?
猜你喜欢
  • 2020-06-28
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多