MySql在内部联接中,哪个表先出现有关系吗?

Nor*_*man 3 mysql sql

我正在选择数据以输出用户已标记书签的帖子。

保持该主表id的第posts一个用户已加书签,被称为bookMarks。这是从表posts中选择的基础posts表格,以显示给用户。

书签

id  |  postId  |  userId
--------------------------
1   |  US01    |  1
2   |  US02    |  1
3   |  US01    |  2
4   |  US02    |  2
Run Code Online (Sandbox Code Playgroud)

帖子

id  |  postId  |  postTitle
--------------------------
1   |  US01    |  Title 1
2   |  US02    |  Title 2
3   |  US03    |  Title 3
4   |  US04    |  Title 4
Run Code Online (Sandbox Code Playgroud)

我的SQL目前是这样的:

select a.postsTitle
from posts a
inner join bookmarks b
  on b.userId = a.userId
  and b.userId = :userId
Run Code Online (Sandbox Code Playgroud)

注意,我把桌子posts放在桌子的前面bookmarks。但是,由于我是根据中的内容进行选择的bookmarks,是否有必要bookmarks先声明表而不是post在sql语句中声明表?这样做会不会导致数据选择或效率出现问题?

还是我应该这样做:

select b.postsTitle
from bookmarks a
inner join posts b
  on a.userId = b.userId
  and a.userId = :userId
Run Code Online (Sandbox Code Playgroud)

注意,我把桌子bookmarks放在第一位。

Mar*_*ams 5

代替以下内容:

select a.postsTitle
from posts a
inner join bookmarks b
  on b.userId = a.userId
  and b.userId = :userId
Run Code Online (Sandbox Code Playgroud)

您应该考虑使用WHERE子句以这种格式设置JOIN的格式,并使用适当的大写字母:

SELECT p.postsTitle
FROM bookmarks b
INNER JOIN posts p
  ON p.userId = b.userId
WHERE b.userId = :userId
Run Code Online (Sandbox Code Playgroud)

尽管对MySQL而言没有什么区别(在性能方面),但按顺序排列INNER JOIN(MySQL将它们视为相等,并且将以相同的方式对其进行优化),但惯例是将要应用WHERE子句的表放在第一位。实际上,假设索引正确,MySQL很可能从具有该WHERE子句的表开始,因为它缩小了结果集的范围,而MySQL喜欢从具有最少行的集合开始。

按照惯例,将连接表的列放在ON子句的第一位。它只是读得更合逻辑。在使用它时,请使用逻辑表别名。

唯一需要注意的是,如果您不命名列,而是使用SELECT *如下代码:

SELECT *
FROM bookmarks b
INNER JOIN posts p
  ON p.userId = b.userId
WHERE b.userId = :userId
Run Code Online (Sandbox Code Playgroud)

您将按查询中列出的顺序获得列。在这种情况下,您将获得的列bookmarks,然后是的列posts

大多数人会说从不使用SELECT *生产查询,但是如果您确实必须返回所有列,并且您需要从头posts开始创建这些列,则可以执行以下操作:

SELECT p.*, b.*
FROM bookmarks b
INNER JOIN posts p
  ON p.userId = b.userId
WHERE b.userId = :userId
Run Code Online (Sandbox Code Playgroud)

明确说明返回的结果集总是好的。