我为返回用户订阅的用户提供了以下连接查询。 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
。
注意:查询有效。我只是不确定是否有更好的方法。
答案 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.如果检查静态值,则没有必要。