2016-06-26 1 views
1

나는이 간단한 테이블했습니다 :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가 포함되어 있습니다. UserIDFriendID은 모두 정수입니다.

문제 : 들어

나는 사건의 하나에 사실를 반환하는 하나의 쿼리 반환 부울 ​​(SELECT CASE WHEN EXISTS)을 기록 할 UserIDFriendID을 제공 : 주어진 사용자 ID가 DnD있다

경우 에서 거짓을 설정하십시오 USER_DND

또는

01 23,516,

주어진 사용자 ID가 USER_DND에서 진정한 DnD 세트가 주어진 FriendID이 추가 그 UserID

에 대한 USER_FRIEND에있는 경우 :이 두 행의 많은 수의 테이블이 있습니다

. 쿼리가 정말 빨라야합니다. 따라서 OR in where clause of query 또는 query having subqueries을 사용하는 것을 선호하지 않습니다. 둘 다 심각한 성능 저하가 있습니다.

+0

나는 이해가 안 돼요을 제거 할 수있는 경우

SELECT MAX(CASE WHEN ud.dnd = 'FALSE' THEN 'TRUE' WHEN uf.FriendID = YourGivenFriendID THEN 'TRUE' ELSE 'FALSE' END) as user_ind FROM USER_DND ud LEFT JOIN USER_FRIEND uf ON(ud.userID = uf.userID) WHERE uf.userID = YourGivenID 

내가 따라서, 각 사용자가 여러 친구를 가질 수 MAX() 가정 두 번째 조건의 논리는별로 의미가 없습니다. 'FriendID'는'USER_FRIEND'에만 존재합니다. 어떻게 그렇게 할 수 없습니까? – sagi

+0

당신의'SHOW CREATE TABLE'은 어떻게 보이나요? 성능의 핵심은 색인입니다. – tadman

+0

@sagi : 질문이 명확 해 지도록 업데이트되었습니다. 지금 확인하십시오. 감사. – Atul

답변

2

당신은 LEFT JOIN를 사용하여 시도 할 수는 1-1, 당신은 MAX()

+0

최상의 솔루션 :) – Atul