2017-10-12 3 views
1

Zum Beispiel habe ich 2 Tabellen Vendor und VendorCategory. Und dann möchte ich 6 zufällige Anbieter mit verschiedenen Kategorien bekommen. Wie soll es in postgresql übersetzt werden? Oder besser QueryDSL für Java.SQL, um 1 zufälligen Datensatz pro Kategorie

Beispiel I haben Anbieter: v1, v2, v3, und so weiter ... Dann habe ich Kategorien: c1, c2, c3 und so weiter ... In unserem Beispiel lassen Sie uns sagen vx eine Kategorie cx hat. Also v1 hat Kategorie c1, v2 hat c2 und so weiter ...

Das Ergebnis der Abfrage sollte v1, v2, v3, v4, v5, v6 zurückgeben. Oder in beliebiger Reihenfolge. Es sollte keinen Anbieter mit derselben Kategorie zurückgeben. Nehmen wir zum Beispiel an, wir haben v1a, das eine Kategorie c1 hat. Daher sollten v1 und v1a nicht zusammen zurückgegeben werden.

+1

Bearbeiten Sie Ihre Frage und liefern Sie Beispieldaten und gewünschte Ergebnisse. Was bedeutet "andere" Kategorie? –

+0

Die Frage wurde aktualisiert. Vielen Dank. – czetsuya

Antwort

2

Dank der 2 Antworten oben ich in der Lage war, mit zu kommen:

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; 

Dies generiert eine zufällige Liste von Anbietern mit eindeutiger Kategorie.

Das eigentliche Problem ist jetzt, wie man es in QueryDSL oder mindestens jpql umwandelt.

1

So etwas wie das. Namen sind abhängig von Ihrer spezifischen Konfiguration:

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; 

so, verschiedene Kategorien, zufällige Zeilen und sechs nur

Wenn Sie eine richtige Antwort erhalten möchten, wenden Sie sich bitte Beispieltabellen zur Verfügung stellen. Ich habe dir gerade die Idee gegeben, wie ich das sehe, nicht die komplette Lösung. (Da es keine realen Daten ist)

+1

Führt zu einem Fehler: "SELECT DISTINCT ON-Ausdrücke müssen mit den ursprünglichen ORDER BY-Ausdrücken übereinstimmen". – czetsuya

1

Sie können DISTINCT ON() verwenden, wie dies (Sonder zu 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

Das ist tatsächlich, was wir uns ausgedacht haben. Aber das Problem ist immer die erste Zeile einer bestimmten Kategorie abzurufen. Zum Beispiel habe ich Kategorie C1 mit Anbieter v1, v2, v3. Egal wie oft ich diese Abfrage ausführe, es gibt immer v1 zurück. – czetsuya

Verwandte Themen