2016-04-25 23 views
0

我想用兩個表中的數據創建一個json對象。

獲取與用戶相關的所有行

表1保持用戶信息
ID
名稱
用戶名
電子郵件

表2容納消息給用戶
ID
的f_id
消息
日期

到目前爲止好。我已成功地做到這一點與LEFT JOIN

  $sql = "SELECT * FROM user LEFT JOIN messages ON user.id = messages.f_id 


$result = mysqli_query($conn, $sql) or die(mysql_error()); 

    while ($data = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 

    $messages[] = array(
     'users' => array(
         'Id' => $data['id'], 
         'Name' => $data['name'], 
         'Username' => $data['username'], 
         'Email' => $data['email'], 

     ), 
     'messages' => array(
         'f_id' => $data['f_id'], 
         'message' => $data['message'], 
         'date' => $data['date'], 
     ); 
     ); 

    } 

但問題/挑戰是,它只是從郵件表中返回一行,即使涉及到用戶那裏多行。

這就是我想要達到

   'user' => array(
         'id' => 1, 
         'name' => John Doe, 
         'username' => Johndoe, 
         'email' => [email protected], 
     ), 
     'messages' => array(
         'id' => 1, 
         'f_id' => 1, 
         'message' => 'Just a test', 
         'date' => 14-08-2014, 

         'id' => 2, 
         'f_id' => 1, 
         'message' => 'Just a test 1', 
         'date' => 12-08-2014, 
     ); 

我怎樣才能做到這一點? 我需要運行一段時間嗎?

+0

問題不在於你的SQL,而在於你的PHP代碼。請張貼相關部分。 – e4c5

+0

西部許多最快的槍回覆!他們中的許多人只是迴應問題中給​​出的完全相同的查詢! – e4c5

+0

@Rorabih你想在查詢結果中合併用戶的詳細信息和消息嗎? –

回答

0

你可以做到這一點在2種方式:

1)僅查詢的用戶,然後在它們之間迭代和查詢每個用戶的信息。這意味着您將查詢數據庫N + 1次,其中N是用戶數量。

2)查詢消息加入用戶(而不是相反),這將導致大量「未使用」的數據,而是一個單一的查詢。

+1

抱歉,但在循環中使用查詢絕對不是要走的路。 – e4c5

+0

我同意,但這仍然是一種選擇,這就是爲什麼我提出了兩種選擇。它們的順序沒有意義。 –

+0

我不會把我的循環內查詢。通過這樣做,我遇到了與另一個項目相關的一些性能問題。謝謝你@RonDadon – Rorabih

0

嘗試:

SELECT 
    user.id AS user_id, user.name, user.email, user.username, 
    messages.id AS message_id, messages.f_id, messages.message, messages.date 
FROM user, messages 
LEFT JOIN messages ON user.id = messages.f_id 

注意,需要爲user.idmessages.id既是列名的別名是相同的。

0

請更新您的SQL查詢

$sql = "SELECT * FROM user Right JOIN messages ON user.id = messages.f_id 

$sql = "SELECT * FROM messages LEFT JOIN user ON user.id = messages.f_id 
0

你可以試試:

SELECT * FROM messages LEFT JOIN user ON user.id = messages.f_id 

它會得到所有的信息與用戶,但如果用戶有沒有消息,您將無法使用這種查詢來獲取它。

0

可能發生的情況是,當您在用戶表上運行查詢時,它將使用該表的主鍵來確保沒有「重複」數據(因爲它應該)。你這裏有兩種選擇:

查詢用戶查詢消息[不推薦]

這可能是有點慢,因爲你會被查詢數據庫中的許多倍。你可以這樣做

SELECT * FROM users; 

後來遍歷用戶產生和運行上的消息

SELECT * FROM messages WHERE f_id = <user_id>; 

有什麼問題,這個查詢?你擁有的用戶越多,這就是更多的浪費,並且您的網站將執行得越慢。不建議。

查詢信息,用戶加入[推薦]

運行此查詢上的消息,而不是用戶。它將使用消息表(這將是id)的主鍵來確定什麼是重複或不重複。

SELECT * FROM messages LEFT JOIN users ON users.id = messages.f_id; 

這是因爲它使用一個查詢來獲取所有你需要的數據,它應該需要一些調整,也許因爲你的網站的發展是更有效的。

+0

使用這個返回冗餘/重複數據(1行 - 2次)我只需要消息表來輸出與用戶表相關的所有行WHERE users.id = messages.f_id;在我的問題中描述的數組中。 – Rorabih

+0

你不能指望SQL爲你設置數據格式 - 你需要用PHP做一些事情來獲得你所描述的確切輸出。你目前使用哪些PHP代碼? –

+0

===編輯===它僅輸出具有相關消息的用戶 - 並顯示爲兩個獨立的對象。消息是否可以列在我的問題中列出的陣列內? – Rorabih

相關問題