이 예제 테이블이 있습니다.
sort_order product color productid price
---------- ------- ------ --------- -----
1 bicycle red 2573257 50
2 bicycle red 0983989 40
3 bicycle red 2093802 45
4 bicycle blue 9283409 55
5 bicycle blue 3982734 60
1 teddy bear brown 9847598 20
2 teddy bear black 3975897 25
3 teddy bear white 2983428 30
4 teddy bear brown 3984939 35
5 teddy bear brown 0923842 30
1 tricycle pink 2356235 25
2 tricycle blue 2394823 30
3 tricycle blue 9338832 35
4 tricycle pink 2383939 30
5 tricycle blue 3982982 35
제품, 평균 가격 및 가장 빈번한 색상을 반환하는 쿼리를 원합니다.
따라서이 예제의 내 쿼리는 다음을 반환 할 것으로 예상됩니다.
product most_frequent_color average_price
------- ------------------- -------------
bicycle red 50
teddy bear brown 28
tricycle blue 31
평균적인 부분은 제품별로 그룹화하고 평균 (가격)을 사용하는 것만으로도 쉬운 것 같지만 가장 빈번한 색상 부분은 어떻게 해결할 수 있습니까?
이것은 지금까지 내가 알아낼 수있는 쿼리이지만 각 그룹에 대해 most_frequent_color를 얻는 방법을 모르겠습니다.
SELECT product, avg(price) AS average_price from products
WHERE sort_order <= 5
GROUP BY product
내 실제 테이블에는 일반적으로 관심있는 것보다 각 그룹에 대해 더 많은 행이 있으므로 sort_order 필드를 사용하여 제한된 양만 가져옵니다.
"color"에 대한 모든 행에 null이 있거나 가장 자주 사용되는 색상이 둘 이상있는 희귀 그룹의 경우 반환 된 most_frequent_color 열에 null을 반환하고 싶습니다.
이것에 대한 도움을 주셔서 감사합니다!
SELECT
절 에서 추가 쿼리를 사용 하여 동일한 데이터에 대해 집계 쿼리를 효과적으로 수행 할 수 있습니다 .
SELECT t.product,
Avg ( t.price ) AS average_price,
(
SELECT IF ( Count(*) = t4.count, NULL, t2.color ) 'color'
FROM products t2
JOIN
(
SELECT t3.product,
t3.color,
count(*) 'count'
FROM products t3
GROUP BY t3.product ,
t3.color
ORDER BY count(*) DESC
) t4
ON t2.product = t4.product
AND t2.color <> t4.color
WHERE t2.product = t.product
GROUP BY t2.color
ORDER BY count(*) DESC limit 1
) AS most_frequent_color
FROM products t
WHERE t.sort_order <= 5
GROUP BY t.product
따라서 열 을 products
사용 하는 두 번째 사본을 연결하고 product
목록 상단에서 가장 자주 발생하는 각 색상의 개수 (해당 제품에 대한)를 선택한 다음 첫 번째 행만 가져옵니다. 따라서 해당 제품의 가장 빈번한 색상 값을 가져옵니다.
이것은 인라인 뷰 ( FROM
쿼리 절에 배치됨)와 동일하지 않습니다 .
참고 : 이것은 MySQL에서 작동하지만 데이터베이스에 구애받지 않습니다.
업데이트 : 이제 동일한 빈도로 둘 이상의 색상을 확인하고 null을 반환합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다