2017-02-06 3 views
0

私は2つのテーブルsms_contactsとsms_twoway_chatを持っています。コンタクトテーブルはIDとしてPKを使用し、contact_typeは3種類のコンタクト(0,1,2)に使用されます。 sms_twoway_chatは2つのコンタクト間のすべてのチャットを保持します。複雑なMysqlのチャットで、最後にNULLを残してdescで並べ替えます。

私はCONTACT_TYPE 0ですべての連絡先を必要とし、いずれかの彼らは私が私が未読必要 を応答を受信したCONTACT_TYPE 1および2を有する唯一の接点(is_read = 0)とのチャットの最近の応答を必要とする をチャットしたりしていない(DATE_TIME DESC)彼らは最後の

CREATE TABLE IF NOT EXISTS `sms_contacts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) DEFAULT NULL, 
    `contacts_name` varchar(50) DEFAULT NULL, 
    `contacts_phone` varchar(11) DEFAULT NULL, 
    `date_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, 
    `date_time_unix` bigint(20) DEFAULT NULL, 
    `contact_type` int(1) DEFAULT '0' COMMENT '0=>contact 1=>group , 2=>instant msg', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ; 


CREATE TABLE IF NOT EXISTS `sms_twoway_chat` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `inbound_id` varchar(50) DEFAULT NULL, 
    `sender_id` int(11) DEFAULT NULL, 
    `receiver_id` int(11) DEFAULT NULL, 
    `is_read` int(1) DEFAULT '0', 
    `msg_body` text, 
    `date_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `date_time_unix` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=89 ; 

この上にある必要があり、一方、トップ

に私が行っていることは、チャットテーブル内のすべてのレコードが一番上に表示されていないタイプ0の接触のように、上にNullを示しています私が試したものです

01解決策として、この程度
SELECT a.* 
    FROM (SELECT c.id,c.`contacts_name` FROM sms_contacts c 
LEFT JOIN sms_twoway_chat tc ON c.id = tc.`receiver_id` 
WHERE user_id = 1 AND c.contact_type = 0 
ORDER BY -tc.`is_read`, tc.date_time DESC 
     ) a 
UNION 
SELECT b.* 
    FROM (SELECT c.id,c.`contacts_name` FROM sms_contacts c 
INNER JOIN sms_twoway_chat tc ON c.id = tc.`receiver_id` 
WHERE user_id = 1 AND c.contact_type IN(1,2) 
ORDER BY -tc.`is_read`,tc.date_time DESC 
     ) b; 

何?

SELECT * 
    FROM (
     SELECT c.id AS i, 1 AS dt 
     FROM sms_contacts c 
     WHERE user_id = 1 AND c.contact_type = 0 
    ) t1 
LEFT JOIN 
(SELECT * 
    FROM (
     SELECT DISTINCT sender_id AS i, MAX(date_time) AS dt 
     FROM sms_twoway_chat 
     WHERE `inbound_id` <> "" AND `receiver_id` =1 
     GROUP BY sender_id 
     ORDER BY MAX(date_time) DESC, sender_id 
    )t3)t2 
ON t1.i = t2.i 
ORDER BY t2.dt DESC 
+0

がなぜNULL可能列がデフォルト値を持っている誰かを助けるかもしれませんか? – Strawberry

+0

sms_twoway_chatテーブルの空白値を持つinbound_idは、送信されたメッセージで埋められた値はその応答を意味します。 – ITGuru

+0

希望の結果を表示するように編集してください – Strawberry

答えて

0

これは

SELECT * 
    FROM (
     SELECT c.id AS i, 1 AS dt, c.`contacts_name` 
     FROM sms_contacts c 
     WHERE user_id = 1 AND c.contact_type = 0 
    ) t1 
LEFT JOIN 
(SELECT * 
    FROM (
     SELECT DISTINCT sender_id AS i, MAX(date_time) AS dt, 2 AS contacts_name 

     FROM sms_twoway_chat 
     WHERE `inbound_id` <> "" AND `receiver_id` =1 
     GROUP BY sender_id 
     ORDER BY MAX(date_time) DESC, sender_id 
    )t3)t2 
ON t1.i = t2.i 
ORDER BY t2.dt DESC LIMIT 0,100 
関連する問題