2014-09-20 79 views
3

我有數據庫這樣的:多選結果在MySQL依賴於其它選擇

schema

例如,一個用戶請求的所有posts數據與posts.post_id = 1。現在,我想從其他表獲得額外的數據:

  • 從表posts一些領域與post_id = 1
  • 所有的Fileds從表postmetapost_id = 1
  • 某些字段從表users依賴於posts.user_id其中post_id = 1
  • 來自表files的所有字段,它們與post_id = 1有關係
  • 某些字段從表terms,其中有一個關於post_id = 1

在PHP中我可以簡單地運行5個查詢來獲取此信息,但我猜是因爲MySQL是能夠將此更快地執行,這是不是最好的方法。

更新細節:

這是我的查詢運行用PHP來獲取信息, database + data

有沒有辦法做到這一點只使用MySQL?

+2

你應該在SQL'JOIN's閱讀起來。 – andy 2014-09-20 21:12:03

+2

我知道小MySQL'JOIN',我寫查詢但結果不太好,我得到4條記錄,包含'posts'字段(重複4條記錄)和'postmeta'字段。這對性能不利,對吧? – 123 2014-09-20 21:18:29

+2

請在給定樣本中添加一些樣本內容和所需結果,並說明爲什麼這是所需結果。 – VMai 2014-09-20 21:26:19

回答

3

單個查詢並不總是優於多個查詢。在這種情況下,我建議只合並你的1對1關係,但爲你的多對一關係保留單獨的查詢,因爲如果一個單獨的文章有3個術語並且2個文件加入多對1關係會產生6行。

選擇後,用戶和postmeta數據

select * from posts p 
join postmeta pm on pm.post_id = p.post_id 
join users u on u.user_id = p.user_id 
where p.post_id = 1 

選擇文件

select f.* from files f 
join file_relationships fr on fr.file_id = f.file_id 
join posts p on p.post_id = fr.post_id 
where p.post_id = 1 

選擇方面

select t.* from terms t 
join term_relationships tr on tr.term_id = t.term_id 
join posts p on p.post_id = tr.post_id 
where p.post_id = 1 
+2

因爲只有'用戶'與'職位'有1 1關係,那麼我已經運行4查詢獲取此數據? – 123 2014-09-20 22:05:07

+2

@ 123在這種情況下是的,會有4個查詢 – FuzzyTree 2014-09-20 22:12:20

1

這應該是所有您需要的聯接,根據需要修改SELECT列表。

select p.post_id, 
     p.post_title, 
     p.user_id, 
     u.user_name, 
     u.user_email, 
     pm.*, 
     f.* 
    from posts p 
    join postmeta pm 
    on p.post_id = pm.post_id 
    join users u 
    on p.user_id = u.user_id 
    join file_relationships fr 
    on p.post_id = fr.post_id 
    join files f 
    on fr.file_id = f.file_id 

*表示來自表的所有列與指定的別名。

+2

如果我使用'JOIN'我有10個或更多的重複列,這不利於性能,可能以其他方式獲得該字段? – 123 2014-09-20 21:25:17

+2

你是指列或行嗎? – VMai 2014-09-20 21:26:57

+2

你可以帶回你想要的任何列。在你的問題中,你沒有說你想要的列,你只是說「一些列」。要麼修改選擇列表以恢復所需的列,要麼在您的問題中指定所需的列,然後將其更改爲只返回那些列。 – 2014-09-20 21:27:01