加入查询解释

时间:2011-07-19 15:32:23

标签: mysql database database-design

我为返回用户订阅的用户提供了以下连接查询。 users表包含用户的数据,subscriptions表包含user_id以及{/ 1}}列中订阅的用户的ID。 / p>

following

我得到以下表结构

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

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

2 个答案:

答案 0 :(得分:2)

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

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子句中指定连接。

答案 1 :(得分:0)

检查以下内容。 - 您的查询也没问题。

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. select旁边的子目录是指定父表的字段。例如,如果两个表上都有相同的字段名称,则父名称用于参考。

2.如果检查静态值,则没有必要。