INNER JOIN 在三个有条件的表上
INNER JOIN on three tables with condition
我正在尝试从标签 slug (URL 用于标签) 获取所有照片详细信息,数据库有三个表:
|-----------------------|
|==> photo |
| -> id |
| -> custom_id |
| -> title |
|-----------------------|
|==> tags |
| -> id |
| -> slug |
|-----------------------|
|==> tags_relation |
| -> tid | <-- this is the tags.id
| -> pid | <-- this is the photo.custom_id
|-----------------------|
这是我的 mysql 代码,用于 INNER JOIN 所有表格并从标签中获取 20 张照片:
SELECT photo.*, tags.*, tags_relation.*,
FROM tags WHERE tags.slug = 'people'
INNER JOIN tags_relation ON = tags_relation.tid = tags.id
INNER JOIN photo ON photo.custom_id = tags_relation.pid
LIMIT 20
ORDER BY photo.date DESC
查询无论如何都不正确,我不明白 INNER JOIN 在这里应该如何工作,知道吗?
谢谢
试试这个..
SELECT photo.*, tags.*, tags_relation.*
FROM tags WHERE tags.slug = 'people'
INNER JOIN tags_relation ON(tags_relation.tid = tags.id)
INNER JOIN photo ON (photo.custom_id = tags_relation.pid)
ORDER BY photo.date DESC
LIMIT 20
SQL 有特定的子句顺序。在你的情况下:
- SELECT
- 来自
- 哪里
- 分组依据
- 订购方式
- 限制
这是始终查询中的顺序。请注意 JOIN
表达式不是 "clauses"。它们是 FROM
子句的一部分(在 MySQL、update
和 delete
子句中也是如此)。
应用于您的查询:
SELECT p.*, t.*, tr.*
FROM tags t INNER JOIN
tags_relation tr
ON tr.tid = t.id INNER JOIN
photo p
ON p.custom_id = tr.pid
WHERE t.slug = 'people'
ORDER BY p.date DESC
LIMIT 20
您会注意到缩进突出了作为语言基础部分的从句。
我还添加了 table 别名,这使得查询更易于编写和阅读。并修复了一些小问题,例如错位的逗号。
我注意到您从数据中提取了太多列。您应该只列出您想要的列(可能 p.*
)。
我正在尝试从标签 slug (URL 用于标签) 获取所有照片详细信息,数据库有三个表:
|-----------------------|
|==> photo |
| -> id |
| -> custom_id |
| -> title |
|-----------------------|
|==> tags |
| -> id |
| -> slug |
|-----------------------|
|==> tags_relation |
| -> tid | <-- this is the tags.id
| -> pid | <-- this is the photo.custom_id
|-----------------------|
这是我的 mysql 代码,用于 INNER JOIN 所有表格并从标签中获取 20 张照片:
SELECT photo.*, tags.*, tags_relation.*,
FROM tags WHERE tags.slug = 'people'
INNER JOIN tags_relation ON = tags_relation.tid = tags.id
INNER JOIN photo ON photo.custom_id = tags_relation.pid
LIMIT 20
ORDER BY photo.date DESC
查询无论如何都不正确,我不明白 INNER JOIN 在这里应该如何工作,知道吗? 谢谢
试试这个..
SELECT photo.*, tags.*, tags_relation.*
FROM tags WHERE tags.slug = 'people'
INNER JOIN tags_relation ON(tags_relation.tid = tags.id)
INNER JOIN photo ON (photo.custom_id = tags_relation.pid)
ORDER BY photo.date DESC
LIMIT 20
SQL 有特定的子句顺序。在你的情况下:
- SELECT
- 来自
- 哪里
- 分组依据
- 订购方式
- 限制
这是始终查询中的顺序。请注意 JOIN
表达式不是 "clauses"。它们是 FROM
子句的一部分(在 MySQL、update
和 delete
子句中也是如此)。
应用于您的查询:
SELECT p.*, t.*, tr.*
FROM tags t INNER JOIN
tags_relation tr
ON tr.tid = t.id INNER JOIN
photo p
ON p.custom_id = tr.pid
WHERE t.slug = 'people'
ORDER BY p.date DESC
LIMIT 20
您会注意到缩进突出了作为语言基础部分的从句。
我还添加了 table 别名,这使得查询更易于编写和阅读。并修复了一些小问题,例如错位的逗号。
我注意到您从数据中提取了太多列。您应该只列出您想要的列(可能 p.*
)。