2013-02-10 153 views
-1

我有两个表格:“用户”和“帖子”。 posts表有'post'列和'poster_id'列。我工作的一个PHP页面,显示由大家将最新的帖子上,像这样:mysql连接不起作用

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

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子句
  • SELECT子句
  • ORDER BY条款

更新1

对于这两个表存在那些列名,他们添加一个ALIAS因此它可以被唯一标识。例如,

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

对上例中的两个表都有列名colName。为了得到它们,你需要在它们前面添加别名,使用PostColUserCol来获得它们的值。

+0

谢谢。我似乎有这个问题。 'posts'和'users'中有一些字段是相同的,当我打印它们时,我得到了错误的列(例如来自用户而不是帖子),我该如何避免这种情况? – 2013-02-10 10:40:32

+0

看到我更新的答案。 ':D' – 2013-02-10 10:53:56

2

尝试:

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

得到了语法有点不正确。

应该

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

已经给出的答案告诉你的主要原因在所有查询不工作(即WHERE条款应该位于JOIN条款后),但是,我想打几个额外的积分:

  • 我建议使用OUTER JOIN为此。它可能没有太大的区别,但是如果邮政记录的无效poster_id,则INNER JOIN将表示该记录从结果中删除,而OUTER JOIN将表示该记录包含在内,但是来自users表将为null。我想你不希望在posts表上有一个无效的poster_id表,但即使在最好的监管系统中也会发生数据损坏,并且在这些情况下仍然有助于从查询中获取数据。

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

这两点都不是必需的;该查询将在没有它们的情况下运行(只要您将WHERE子句切换到JOIN之后),但它们可能会改善您的查询并希望可以提高您对SQL的理解。