alert, user_to_alert 및 user_device 테이블이 3 개 있습니다. 장치 테이블은 토큰 목록을 보유하고 user_id 필드를 포함합니다.가입 된 상관 하위 쿼리
user_to_alert 테이블에는 사용자가 경고를 읽을 때 기록이 보관됩니다. 적절한 alert_id/user_id 콤보에 대한 레코드가 없으면 사용자가 경고를 읽지 않았 음을 의미합니다. 또한 alert_read 열은 0 일 수 있습니다 (사용자가 읽은 후 경고를 읽지 않은 것으로 표시 한 경우).
장치 토큰 목록을로드하는 쿼리가 있는데 읽지 않은 경고 수가 포함되도록이 토큰을 확장해야합니다. 이것은 내가
SELECT d.*, (
SELECT COUNT(*) FROM `alert` AS a
LEFT JOIN `user_to_alert` AS uta ON
(uta.`alert_id` = a.`alert_id` AND uta.`user_id` = d.`user_id`)
WHERE uta.`alert_read` = 0 OR uta.`alert_read` IS NULL) AS user_badge_number
FROM `user_device` AS d
WHERE d.`device_type` = 'iOS' AND d.`device_active` = 1
GROUP BY d.`device_token`
이 쿼리와 함께 왔어요 질의 것은 내가 설정을했습니다 나에게 오류 #1054 - Unknown column 'd.user_id' in 'on clause'
을 제공 스키마 및 쿼리와의 SQLFiddle : http://sqlfiddle.com/#!9/ee653/2
내 서브를 실행하는 경우 별도로 쿼리하고 유효한 user_id 대신 d.user_id를 사용하면 예상되는 결과를 얻습니다 (예 : user_id 10의 경우 3). 이 문제는 내가 d.user_id 열을 참조하고 있음을 의미한다고 가정합니다. 나는 d.user_id가 아직 유효한 컬럼이 아니기 때문에 MySQL이 서브 쿼리를 먼저 수행하려고 시도하고 있다고 생각한다. 그것은 단지 추측입니다.
ON 절의 부분을 uta.user_id = d.user_id
WHERE 절로 이동했지만 모든 행에 user_badge_number 열에 0을 부여했습니다.
Google에서이 문제와 관련된 것을 찾는 데 문제가 있습니다. 상관 관계가있는 부질의에 대해 찾은 모든 것은 여분의 데이터를 검색하는 대신 ON 또는 WHERE 절에서 사용하는 것 같습니다.
이것은 PHP 스크립트를 통해 실행되므로 PHP 스크립트의 결과 루프 내에서 하위 쿼리를 단독으로 실행할 수 있음을 알고 있습니다. 분명히, 나는 오히려 더 효율적 일 것이기 때문에 한 가지 질문으로 그것을하는 방법을 이해할 것입니다. 당신이 언급 한 바와 같이
나는 장치가 아닌 사용자를 기반으로 경고 읽기를 추적하고 있습니다. 사용자가 두 개 이상의 기기를 사용하는 경우 읽지 않은 횟수는 모든 기기에서 동일합니다. 알리미를 발송 한 후에 작성한 사용자에 대해서는 좋은 지적이 있습니다. 전체 계정 수를 사용자 계정을 만든 후 보낸 경고만으로 제한함으로써이 문제를 피할 수있었습니다. 내 답변을 제거하고 쿼리 자체 내에서 뺄셈을 사용하면 조금 더 나아질 것이므로이를 받아 들일 것입니다. – kinadian
내가 제기 한 문제를 해결하기 위해 날짜 범위를 사용하는 것이 좋은 점. 나는 그 제안을 포함하도록 나의 대답을 편집했다. – Bampfer
FWIW 당신의 삭제 된 대답은 나에게 뺄셈을 할 수있는 아이디어를주었습니다. 첫 번째 초안은 읽지 않은 항목의 수를 계산하기 위해 CROSS JOIN을 사용했습니다. 뺄셈은 훨씬 간단했다. – Bampfer