일부 다른 값을 기반으로 하는 Mysql RAND() 함수
저는 다음과 같은 테이블 구조를 가지고 있습니다.
id | product | value
-----+---------+--------
1 | test1 | 10
-----+---------+--------
2 | test2 | 30
-----+---------+--------
3 | test3 | 25
-----+---------+--------
4 | test4 | 20
-----+---------+--------
5 | test5 | 15
-----+---------+--------
6 | test6 | 35
-----+---------+--------
사용자들에게 추천하고 싶은 제품들인데, 한 가지 예외를 제외하고 가장 가치 있는 제품인 4가지 제품을 홈페이지에 보여주고 싶습니다.
그래서 보통 이 제품을 항상 전시하고 싶습니다.test6, test2, test3, test4
. 유일한 문제는 가끔 다른 제품들을 대신 전시해주길 원하지만, 더 낮은 비율로 전시해주길 원한다는 것입니다.내가 이걸 원하지 않았다면 아마order by value desc
. 하지만 중요한 것은 사용자들이 항상 같은 4개의 제품을 보는 것을 지루하게 하지 않았으면 하는 것이고, 가끔 목록에 다른 제품을 한두 개씩 넣었으면 하는 것입니다.
지금은 mysql에 RAND() 함수가 있다는 것을 알고 있지만 정확히 원하는 작업을 수행하기 위해 쿼리를 만드는 데 어떻게 사용할 수 있는지 모르겠습니다.
수학적으로 다음과 같이 작동해야 합니다.
우리는 모든 값을 더합니다.10+30+25+20+15+35 = 135
, 우리는 각 제품에 대한 무작위 비율을 보기 위해 세 번째 규칙을 적용합니다.
135 = 100%
------------
10 = 7.4%
30 = 22.2%
25 = 18.5%
20 = 14.8%
15 = 11.1%
35 = 25.9%
그래서 이 비율을 고려해서 랜덤으로 4개의 제품 목록을 돌려줄 뿐만 아니라 그 비율을 기준으로 어떤 제품이 더 많은 출현 기회를 가질 것인지를 고려하는 질문을 하고 싶습니다.
제가 mysql 전문가가 아니기 때문에 아직 무엇을 시도했는지 묻지 마세요. PHP로 이것을 할 수 있는 방법은 알고 있지만 mysql 만으로 이것이 가능한지, 그리고 어떻게 할 수 있는지 알고 싶습니다.
변수를 사용해서 할 수 있습니다.누적합계를 취하여 정규화한 후 사용rand()
:
select t.*
from (select t.*, (@v := @v + value) as running_value
from t cross join
(select @v := 0) params
) t cross join
(select sum(value) as sum_value
from t
) total
order by (rand() between (t.running_value - t.value)/total.sum_value and t.running_value / total.sum_value) desc,
rand();
위의 내용은 단순화할 수 있습니다.그리고 또.rand()
에서order by
computed을 많이 할 수도 있습니다.저는 이게 더 좋다고 생각합니다.
select t.*
from (select t.*, (@v := @v + value) as running_value, rand() as rnd
from t cross join
(select @v := 0) params
) t
order by (rnd between (t.running_value - t.value)/@v and t.running_value/@v) desc;
편집:
지금 생각해보니 이항 결과는order by
주문하기에 아주 적합한 물건입니다.이것은 하나의 행을 선택할 때는 적절하지만 반드시 주문할 필요는 없습니다.
이것이 더 나은 접근 방식이라고 생각합니다.
select t.*
from (select t.*, rand() as rnd
from t
) t
order by rnd * t.value desc;
언급URL : https://stackoverflow.com/questions/41915776/mysql-rand-function-based-on-some-other-values
'programing' 카테고리의 다른 글
EXPRESON의 "Using index"와 "Using were; Using index"의 차이점은 무엇입니까? (0) | 2023.09.27 |
---|---|
If a global variable is initialized to 0, will it go to BSS? (0) | 2023.09.27 |
MYSQL Left Join NULL 값을 선택하려면 어떻게 해야 합니까? (0) | 2023.09.17 |
Pandas 데이터 프레임에 문자열이 있는지 확인합니다. (0) | 2023.09.17 |
XML 명령줄 처리를 위한 Grep and Sed equivalent (0) | 2023.09.17 |