2016-04-28 82 views
1

我有這個表:與多行獲取從關係表中的數據

博客

id 
name 
user_id // author - relational to "users" 

用戶

id 
nickname 
avatar 

suscriptions

id 
blog_id // relational to "blogs" 
user_id // relational to "users" 

這樣做是爲了顯示在網站上是這樣的:

Blogname 
Created By Stack 
Suscriptions: Overflow, Easy, Robinson, Porter 

我是從blogs

SELECT 
    b.id, 
    b.name, 
    b.user_id, 
    u.nickname as user_nickname, 
    u.avatar as user_avatar 
FROM blogs b 
LEFT JOIN users u ON b.user_id = u.id 

獲取所有數據使用PHP,我創建的所有blogs ID數組,因此我可以將它們與IN運算符一起使用,如下所示:

SELECT 
    s.id, 
    s.blog_id, 
    u.nickname, 
    u.avatar 
FROM suscriptions s 
LEFT JOIN users u ON s.user_id = u.id 
WHERE s.blog_id IN (1, 2, 3) 

And t再次使用PHP來排序結果。

但是,有沒有更好的方法?我正在考慮只使用MySQL而不使用PHP。也許在一個查詢中獲取所有數據?或者什麼是獲得這個最好的方法?

重要的是要記住blog可以有幾個subscriptions

2012年我發現這個問題有點類似:JOIN three tables and aggregate data from multiple rows for every DISTINCT row in separate column 但是OP說它真的很慢,所以我現在有點迷路了。

+0

你使用PHP核心或一些框架? –

+0

@SulthanAllaudeen僅用於數據庫處理的PDO –

回答

0

我認爲你需要將所有由'連接提示'生成的行進行分組,並用逗號將它們連接起來進行演示。

SELECT 
    b.id AS blog_id, 
    b.name AS blog_name, 
    u.nickname AS user_create_nickname, 
    u.avatar AS user_create_avatar, 
    GROUP_CONCAT(us.nickname SEPARATOR ', ') AS users_suscritions 
FROM blogs b 
INNER JOIN users u ON b.user_id = u.id 
LEFT JOIN suscriptions s ON s.blog_id = b.id 
LEFT JOIN users us ON s.user_id = us.id 
GROUP BY b.id; 
+0

真的很有幫助,謝謝!但我也希望獲得懷疑的信息,因爲它會有其他列像日期等。對不起,不能在這個問題上解釋這一點。 –

+0

據我所知,在這種情況下,據我所知,你真的需要兩個查詢 – Doglas

+0

'GROUP_CONCAT'目前運行良好,謝謝! –

0

你可以做任何一種。幾個小的查詢或一個大的查詢有更多的連接或(甚至子查詢)一次獲取所有數據。在任何情況下,您都不會注意到任何性能差異,直到您獲得大量數據。

如果您剛剛開始使用PHP,我會建議堅持讓更小的查詢更易於調試和理解。在所有的MySQL都能很好地執行小型快速查詢之後。

很快,您將移動到將爲您編寫查詢的ORM(或框架)。你只需要關注你試圖解決的問題的邏輯。

例如在CakePHP中,你只需要做到:

$blogs = $this->Blog->find('all') 

的,而且是一個Blog屬於一個UserUser可以有很多Subscriptions,所有的數據都將被「自動地」恢復(這會自行爲連接表生成SQL,如Doglas's answer中的那樣)。

就目前而言,我建議把重點放在建立小查詢容易理解調試優化保持

這裏是a list of ORMs in PHP。這些都很常見:

  1. Eloquent來自Laravel團隊。
  2. Propel

而且here is關於來自同一博客奧姆斯職位;)

+0

我不知道這個,看起來很實用,謝謝,我會盡快看看! –

相關問題