-1

我有两个表:“用户”和“帖子”。帖子表有一个“post”列和一个“poster_id”列。我正在开发一个 PHP 页面,该页面显示每个人的最新帖子,如下所示:

SELECT * FROM posts WHERE id < '$whatever' LIMIT 10

这样,我可以像这样打印每个结果:

id: 43, poster_id:'4', post: hello, world
id: 44, poster_id:'4', post: hello, ward
id: 45, poster_id:'5', post: oh hi!
etc...

而不是 id,我想显示海报的名称(在“用户”表中有一个列)

我尝试了以下方法:

SELECT * 
FROM posts 
WHERE id < '$whatever' 
       INNER JOIN users 
           ON posts.poster_id = users.id LIMIT 10

这是此任务的正确联接类型吗?在了解联接​​之前,我会查询用户表以获取每个帖子结果。结果应该最终看起来类似于:

id: 43, poster_id:'4', name:'foo', post: hello, world
id: 44, poster_id:'4', name:'foo', post: hello, ward
id: 45, poster_id:'5', name:'fee', post: oh hi!
etc...

感谢您提前提供帮助。

4

4 回答 4

4

WHERE子句必须在FROM子句之后。

SELECT  posts.*, users.*   // select your desired columns
FROM    posts 
        INNER JOIN users ON posts.poster_id = users.id 
WHERE   id < '$whatever'
LIMIT   10

SQL 操作顺序如下:

  • FROM 子句
  • WHERE 子句
  • GROUP BY 子句
  • HAVING 子句
  • 选择子句
  • ORDER BY 子句

更新 1

对于两个表上都存在的那些列名,在它们上添加一个ALIAS,以便可以唯一标识。例子,

SELECT  post.colName as PostCol, 
        users.colName as UserCol, ....
FROM ....

在上面的示例中,两个表都有列 name colName。为了同时获得它们,您需要在它们上添加别名,以便在前端使用PostColUserCol获取它们的值。

于 2013-02-10T10:35:35.207 回答
2

尝试:

SELECT *
FROM posts
INNER JOIN users ON posts.poster_id = users.id
WHERE posts.id < '$whatever'
LIMIT 10
于 2013-02-10T10:36:00.843 回答
0

语法有点不正确。

应该

SELECT * FROM posts
INNER JOIN users ON posts.poster_id = users.id
WHERE id < '$whatever' LIMIT 10
于 2013-02-10T10:36:38.457 回答
0

已经给出的答案告诉您查询根本不起作用的主要原因(即WHERE子句应该在JOIN子句之后),但是,我想补充几点:

  • 我建议OUTER JOIN为此使用 an 。它可能不会有太大区别,但是如果 post 记录具有 invalid poster_id, anINNER JOIN将意味着记录从结果中删除,而 anOUTER JOIN将意味着记录被包含,但users表中的值将是null. 我想您不希望poster_idposts表上出现无效数据,但即使在监管最好的系统中也会发生损坏的数据,并且在这些情况下仍然从查询中获取数据是有帮助的。

  • 我强烈建议不要这样做SELECT *,而是逐项列出要从查询中返回的字段。SELECT *有很多问题,但是当您在查询中有多个表时尤其糟糕,因为如果您在两个表上都有同名的字段(例如id),那么很难区分您正在使用哪个表,因为您的 PHP 记录集不会包含表引用。逐项列出字段可能会使您的查询字符串更长,但不会使其变慢 - 如果有的话,它会更快 - 从长远来看,它会更容易使用。

Neither of these points are essential; the query will work without them (as long as you switch the WHERE clause to after the JOIN), but they may improve your query and hopefully also improve your understanding of SQL.

于 2013-02-10T11:08:37.863 回答