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 

查询是不正确的,无论如何,我无法理解内该如何加入应该在这里工作,任何想法? 感谢

+0

我认为你在第一行有一个错误,它的'tgas。*'而不是'tags。*',而在第二行它的FORM'而不是'FROM' – 2015-03-13 10:24:30

+0

@NarendraSisodia谢谢指出,这是一些错字 – rakibtg 2015-03-13 10:25:56

SQL有条款的具体顺序。你的情况:

  • 选择
  • FROM
  • WHERE
  • GROUP BY
  • ORDER BY
  • LIMIT

这是总是在查询中的排序。请注意,JOIN表达式不是“子句”。它们是FROM子句的一部分(以及MySQL中的updatedelete子句)。

适用于您的查询:

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.*)。

+0

他们可能不是条款,但对我来说他们是这样的艾滋病可读性。我更喜欢我的格式(显然),但各自为自己。 – Strawberry 2015-03-13 11:04:24

+0

@GordonLinoff我从你的答案中学到了很多东西,非常感谢。还有一件事我不明白你指出你答案的最后一行。 – rakibtg 2015-03-13 11:06:15

+1

@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