INNER三个表连接的具有条件
我试图从一个标签蛞蝓(网址为标记)获取所有照片的细节,该数据库有三个表:INNER三个表连接的具有条件
|-----------------------|
|==> 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
查询是不正确的,无论如何,我无法理解内该如何加入应该在这里工作,任何想法? 感谢
SQL有条款的具体顺序。你的情况:
- 选择
- FROM
- WHERE
- GROUP BY
- ORDER BY
- LIMIT
这是总是在查询中的排序。请注意,JOIN
表达式不是“子句”。它们是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
你会注意到,压痕突出这是语言的基本组成部分的条款。
我还添加了表别名,这使得查询更容易编写和读取。并修复了一些小问题,比如错位的逗号。
我注意到你拉太多的列数据。你应该列出你想要的列(可能是p.*
)。
他们可能不是条款,但对我来说他们是这样的艾滋病可读性。我更喜欢我的格式(显然),但各自为自己。 – Strawberry 2015-03-13 11:04:24
@GordonLinoff我从你的答案中学到了很多东西,非常感谢。还有一件事我不明白你指出你答案的最后一行。 – rakibtg 2015-03-13 11:06:15
@meh。 。 。可能没有理由把标签放在'select'中,因为你已经知道它是'slug'。 – 2015-03-13 11:17:02
试试这个..
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
我认为你在第一行有一个错误,它的'tgas。*'而不是'tags。*',而在第二行它的FORM'而不是'FROM' – 2015-03-13 10:24:30
@NarendraSisodia谢谢指出,这是一些错字 – rakibtg 2015-03-13 10:25:56