2012-07-09 186 views
0

這是我的場景:我有兩個不同的表格: 表'訂閱'包含與訂閱用戶網站相關的所有信息,以及'收視表',其中包含訂閱網站產品的分數。簡化是類似的東西:創建一個結合了MySQL中幾個查詢結果的結果集?

Subscriptions: 'id','user','place','created', etc. 
Ratings: 'id','user','product','created',etc. 

現在我需要MySQL來回報我最近的10個項目,無論是訂閱或評級。到目前爲止,該解決方案發現是使兩個不同的調用:

SELECT * FROM subscriptions WHERE ... ORDER BY created LIMIT 10. 

有了兩個結果(20元),我通過「創建」責令多維數組,並與(保存在$項目取得前10名):

$items = array_slice($items, 0, 10); 

我懷疑這個解決方案是沒有效率的,因爲我得到它在兩個呼叫,並返回更elemnts比我更需要。我一直在讀UNION操作符允許你一次選擇幾個不同的表,但列數相同。我的問題是,在一次調用中,通過共同字段(在我的情況下創建)中加入特定數量的不同類型元素的最有效方法是什麼?是可能的嗎?非常感謝,任何幫助表示讚賞, Jesús。

回答

2

UNION是必需的。

您可以在此瞭解如何使用它:

Join two tables, then Order By date, BUT combining both tables

這不是在我發佈的鏈接解釋,但可以把限制對一個UNION爲好。結合ORDER BY這是你所需要的。 (CRED到弗裏茨麪包車坎彭)

(SELECT cols FROM subscriptions) 
UNION 
(SELECT cols FROM ratings); 
ORDER BY created LIMIT 10 
+1

這不是在鏈接解釋maxhud公佈,但可以把'LIMIT'上'UNION'爲好。結合'ORDER BY'這是你需要的。 – Halcyon 2012-07-09 16:48:16

+0

使用UNION的查詢仍然是一個調用... – Braiba 2012-07-09 16:51:09

+0

已編輯。 @FritsvanCampen希望這沒關係我在那裏寫了。不希望操作員錯過您的評論 – maxhud 2012-07-09 16:52:10

1

修改您的查詢使用UNION的結果結合起來,一旦有結果已合併,您可以利用由限制方法和順序的輸出限制到所需數量的記錄。

通過或LIMIT應用於爲了將個人選擇,將條款 圍住,括號內的SELECT:

另外:

使用ORDER BY或LIMIT子句來排序或限制整個UNION 結果,將單個SELECT語句括起來並在最後一個之後放置ORDER BY或LIMIT。

(SELECT cols FROM subscriptions WHERE ... ORDER BY created LIMIT 10) 
UNION 
(SELECT cols FROM ratings WHERE ... ORDER BY created LIMIT 10); 
ORDER BY created LIMIT 10 
+0

但我明白我只能使用UNION,如果我的查詢具有相同的列數...是真的嗎?在我的情況下,兩個表都有不同的列。編輯:在你的例子中,我得到20個元素,每個表10個,不是嗎? – 2012-07-09 16:52:34

+0

這是正確的,所以不是使用'*'來選擇所有列,而只是選擇適用的列來使輸出匹配。 – RobB 2012-07-09 16:53:42

+2

這段代碼是錯誤的,您應該將'ORDER BY created'LIMIT 10'移動到'UNION'的外部。此代碼爲您提供最近10次訂閱和最近10次評分,其中OP要求最近10個'項目'(訂閱或評分)。 – Halcyon 2012-07-09 16:54:09