postgresql에는 name
및 meta_data
열 이있는 사용자 테이블이 있습니다. Meta_data
열은 jsonb이며 다음과 같은 데이터를 저장합니다.
"{"likes": [{"id": "1", "name": "aaa"}, {"id": "2", "name": "bbb"}, {"id": "3", "name": "ccc"}]}"
각각의 좋아요에 대해 같은 좋아요를 가진 사용자 수를 선택하고 싶습니다.
SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
(SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = like_id ) AS count_users
FROM users
또한 열 이있는 clickouts
테이블이 user_id
있습니다. 특정 like_id를 가진 사용자가 클릭 한 횟수가 필요합니다.
COUNT(clickouts.id) FILTER (
WHERE clickouts.user_id IN
(SELECT user_id FROM users WHERE users.meta_data->'likes'->>'id' = like_id)
)
이러한 쿼리는 작동하지 않습니다. 오류 메시지는 다음과 같습니다.
"like_id"열이 없습니다.
이를 달성하는 방법에 대한 제안이 있습니까?
그런 다음 다음과 같은 위치에서 동일한 논리를 사용합니다.
SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
(SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = jsonb_array_elements(users.meta_data->'likes')->>'id' ) AS count_users
FROM users
그러나 각 like_id에 대해 행이 1 개 이상이면 중복 항목이 많으므로 group by를 사용해야합니다.
SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
count(jsonb_array_elements(users.meta_data->'likes')->>'id') AS count_users
FROM users
GROUP BY jsonb_array_elements(users.meta_data->'likes')->>'id'
편집하다:
내부 쿼리에서 별칭을 사용하려면 다음과 같이 시도하십시오.
SELECT t.like_id,
(SELECT count(*) FROM users WHERE users.meta_data->'likes'->>'id' = t.like_id ) AS count_users FROM (
SELECT jsonb_array_elements(users.meta_data->'likes')->>'id' AS like_id,
FROM users) t
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다