2017-10-12 1 views
1

예를 들어 2 개의 테이블 vendor와 vendorCategory가 있습니다. 그리고 나서 다른 카테고리의 6 명의 임의 판매 업체를 얻고 싶습니다. PostgreSQL로 어떻게 변환해야합니까? 또는 Java 용 QueryDSL을 개선하십시오.카테고리 당 1 개의 임의 레코드를 얻으려는 SQL

예 나는 업체가 : V1, V2, V3를, 등등 ... 가 그럼 난 종류가 있습니다 등등 C1, C2, C3 및 우리의 예에서 은의이 VX이 카테고리 CX를 가지고 가정 해 봅시다. 따라서 v1에는 카테고리 c1이 있고 v2에는 c2가 있습니다.

쿼리 결과는 v1, v2, v3, v4, v5, v6을 반환해야합니다. 또는 무작위 순서로. 동일한 범주의 공급 업체를 반환해서는 안됩니다. 예를 들어 카테고리 c1을 가진 v1a가 있다고 가정 해 봅시다. 따라서 v1과 v1a는 함께 반환되어서는 안됩니다.

+1

질문을 편집하고 샘플 데이터와 원하는 결과를 제공하십시오. "다른"범주의 의미는 무엇입니까? –

+0

질문이 업데이트되었습니다. 감사. – czetsuya

답변

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; 

그래서, 별개의 범주, 임의의 행과는 여섯

, 샘플 테이블을 제공하십시오. 나는 당신에게 내가 어떻게 그것을 보았는지에 대한 아이디어를주었습니다. 완전한 해결책이 아닙니다. (PostgreSQL의 특별한)이 같은 (이 있기 때문에 실제 데이터 없음)

+1

"DISTINCT ON식이 초기 ORDER BY 식과 일치해야합니다"오류가 발생합니다. – czetsuya

1

당신은 (DISTINCT ON을 사용할 수 있습니다) : 내가 가지고 올 수 있었다 위의 두 답변에

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

관련 문제