2013-02-10 120 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的理解。