2017-10-12 35 views
1

例如1個隨機記錄我有2個表供應商和vendorCategory。然後我想要獲得6個不同類別的隨機供應商。它應該如何轉換爲postgresql?或者更好的QueryDSL for java。SQL,讓每類

比如我有廠商:V1,V2,V3,等等... 然後,我有三類:C1,C2,C3等... 在我們的例子,讓我們說,VX有一類CX。因此V1具有C1類別,V2具有C2等等...

查詢的結果應該返回V1,V2,V3,V4,V5,V6。或以任何隨機順序。它不應該返回具有相同類別的供應商。例如,假設我們有v1a,它有一個類別c1。所以v1和v1a不應該一起返回。

+1

編輯你的問題,並提供樣本數據和預期的結果。 「不同」類別是什麼意思? –

+0

更新了問題。謝謝。 – czetsuya

回答

2

多虧了2個回答上面我能想出:

select * from 
(
SELECT DISTINCT ON(vc.id) v.vendor_name, vc.description, vc.id 
FROM cat_vendor_category AS vc 
INNER JOIN cat_vendor AS v ON v.vendor_category_id = vc.id 
ORDER BY vc.id, random() 
    ) Q 
    order by random() 
LIMIT 6; 

這產生具有獨特的類廠商的隨機列表。現在

真正的問題是如何將其轉化爲QueryDSL或至少JPQL。

1

這樣的事情。名稱取決於您的具體配置:

SELECT DISTINCT ON(vc.id), v.vendorName, vc.categoryName 
FROM vendorCategory AS vc 
INNER JOIN vendors AS v ON v.categoryId = vc.id 
ORDER BY random() 
LIMIT 6; 

因此,不同的類別,隨機行,只有六個

如果你想獲得一個正確的答案,請提供樣品表。我剛纔給你的想法是我看到的,而不是完整的解決方案。 (因爲沒有真實數據)

+1

拋出一個錯誤:「SELECT DISTINCT ON表達式必須BY表達式初始順序一致」。 – czetsuya

1

您可以使用DISTINCT ON()這樣的(特別到PostgreSQL):

SELECT DISTINCT ON (vc.categoryName) v.vendorName, vc.categoryName 
FROM vendorCategory vc 
INNER JOIN vendors v ON v.categoryId = vc.id 
LIMIT 6 
+0

這實際上是我們想出了。但問題是它總是檢索某個類別的第一行。比如我有一個供應商的V1,V2,V3 C1類。然後無論我運行這個查詢多少次,它總是返回v1。 – czetsuya