나는이 간단한 테이블했습니다 :MySQL의 : 사용자가 DND를 설정하지 않았거나 사용자가 설정 한 경우 DND 주어진 ID 친구 있어야합니다 경우에 true를 돌려 부울 쿼리
1. USER_DND
╔════════╦══════╗
║ UserID ║ DnD ║
╠════════╬══════╣
╚════════╩══════╝
2. USER_FRIEND
╔════════╦══════════╗
║ UserID ║ FriendID ║
╠════════╬══════════╣
╚════════╩══════════╝
USER_DND
을 : 그것은 사용자와의 ID가 포함 자신의 do not disturb (Dnd) 플래그. UserID
은 정수이며 기본 키입니다. DnD
은 부울 값입니다.
USER_FRIEND
: 사용자의 친구 ID가 포함되어 있습니다. UserID
및 FriendID
은 모두 정수입니다.
문제 : 들어
나는 사건의 하나에 사실를 반환하는 하나의 쿼리 반환 부울 (SELECT CASE WHEN EXISTS
)을 기록 할 UserID
및 FriendID
을 제공 : 주어진 사용자 ID가 DnD
있다
경우 에서 거짓을 설정하십시오 USER_DND
또는
01 23,516,주어진 사용자 ID가 USER_DND
에서 진정한 DnD
세트가 주어진 FriendID이 추가 그 UserID
에 대한 USER_FRIEND
에있는 경우 :이 두 행의 많은 수의 테이블이 있습니다
. 쿼리가 정말 빨라야합니다. 따라서 OR
in where clause of query 또는 query having subqueries을 사용하는 것을 선호하지 않습니다. 둘 다 심각한 성능 저하가 있습니다.
나는 이해가 안 돼요을 제거 할 수있는 경우
내가 따라서, 각 사용자가 여러 친구를 가질 수MAX()
가정 두 번째 조건의 논리는별로 의미가 없습니다. 'FriendID'는'USER_FRIEND'에만 존재합니다. 어떻게 그렇게 할 수 없습니까? – sagi당신의'SHOW CREATE TABLE'은 어떻게 보이나요? 성능의 핵심은 색인입니다. – tadman
@sagi : 질문이 명확 해 지도록 업데이트되었습니다. 지금 확인하십시오. 감사. – Atul