我正在选择数据以输出用户已标记书签的帖子。
保持该主表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放在第一位。
代替以下内容:
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)
明确说明返回的结果集总是好的。
| 归档时间: |
|
| 查看次数: |
3066 次 |
| 最近记录: |