2017-03-17 1 views
0

에 의해 :채팅 - 선택 - GROUP을 나는 이러한 테이블이

테이블 이름 : _ 데이터

--------------------------- 
| id | owner | name | 
--------------------------- 
| 1 | 120 | "Nicolas" | 
| 2 | 140 | "Angel" | 
--------------------------- 

테이블 이름 : private_messages

-------------------------------------------- 
| id | ownerID | toUserID | message  | 
-------------------------------------------- 
| 1 | 120 | 140 | "Hi"   | 
| 2 | 120 | 140 | "How are you?" | 
| 3 | 120 | 140 | "I miss u"  | 
| 4 | 140 | 120 | "Viewed."  | 
-------------------------------------------- 

내가 선택해야을 예를 들어 사용자 ID가 "120"인 모든 행에 대해 사용자가 채팅을하면 모든 채널을 반환하는 쿼리를 만들어야합니다. ownerID 또는 toUserID에 "120"으로 표시되는 ats.

이 내 실제 쿼리입니다 :

---------------------------------------- 
| owner | name  | message  | 
---------------------------------------- 
| 120 | "Nicolas" |  "Hi"  | 
| 140 | "Angel" | "Viewed." | 
---------------------------------------- 

그러나 당신이 생각하는 경우이 두 요소가 같은 채팅을하기 때문에, 이것은 잘못입니다 :

SELECT 
user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.ownerID = user_data.owner 
WHERE private_messages.owner = "120" OR private_messages.toUserID = "120" 
GROUP BY user_data.owner 

이 쿼리에 대한 결과입니다. 올바른 결과는 두 사용자 간의 마지막 메시지 여야합니다.

---------------------------------------- 
| owner | name  | message  | 
---------------------------------------- 
| 140 | "Angel" | "Viewed." | 
---------------------------------------- 

방법이 있습니까?

+1

? 그러면 예상 결과가 단일 행입니까? 논리를 좀 더 자세히 설명해주십시오. –

+0

이 테이블에는이 두 명의 사용자 만 있습니까? 아니면 다른 사용자 아이디가 있습니까? 어쩌면 좀 더 많은 정보가 도움이 될 것입니다 .... – Kevin

+0

** 두 사용자 모두에게 속하는 메시지가 필요한 경우 왜 'WHERE' 절에'OR'을 사용합니까? 'private_messages.owner = "120"AND private_messages.owner = "140"'과 같은 것이 필요합니다. – abcdn

답변

0
SELECT 
user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.owner = user_data.owner 
WHERE private_messages.touser = "120" 
GROUP BY user_data.owner 
+0

'120'은'touser' 또는'ownerid' 일 수 있습니다. –

+0

답변을 추가 할 때 코드 스 니펫이 아닌 설명을 포함하십시오. –

0
SELECT private_messages.id, user_data.owner, 
ANY_VALUE(user_data.name) name, 
ANY_VALUE(private_messages.message) message 
FROM private_messages 
INNER JOIN user_data ON private_messages.ownerID = user_data.owner 
WHERE private_messages.owner = "120" OR private_messages.toUserID = "120" 
GROUP BY user_data.owner order by private_messages.id DESC LIMIT 1 

당신은 하나의 여분의 열을 얻을 것이다. ID 행을 제외하도록 쿼리를 필터링 할 수 있기를 바랍니다.

0

이 시도 :

모든 채팅이 필요하지만, 그때까지 그룹을 사용하는 말 왜
select u.owner, u.name, p.message 
from private_messages p 
left join user_data u 
    on p.ownerid = u.owner 
where p.id = (select MAX(id) id 
       from private_messages 
       where (ownerid = u.owner or touserId = u.owner) 
       and ownerid = 140) 
+0

안녕하세요. Rigerta, 하나의 질문입니다. 왜 테이블 이름을 설정하기 전에 "#"를 사용합니까? –

+0

안녕하세요, 죄송합니다. 임시 테이블을 만들어서 상황을 재현하기 때문입니다. 나는 대답을 편집 할 것이다. –

+0

당신에게 좋은 점은 chat이라는 테이블이 있고 각 private_messages 레코드가 chat_id를 가지고 있다는 것입니다. 두 명의 사용자가 서로 메시지를주고 받으면이 chat_id를 추적해야하며 채팅의 최신 메시지를 찾아야 할 때마다 chat_id가 될 private_messages의 max (id) 만 확인하면됩니다. 이 2 명의 사용자가 그들 사이에 가지고있는 것. –