2016-09-22 163 views
0

我有三个表与用户不同的记录组,MySQL查询获得计数结果和

User 

username |  realname |   date 
evn-az-3ju   john  11/2012 03:09:40 p.m. 
jwyvm_rdyt   steve  12/2012 03:09:40 p.m. 
bsMIAtWkhi   mahesh  01/2013 03:09:40 p.m. 
zrObzh4um0   santa  01/2013 03:09:40 p.m. 
WyVm_rDYt   grolsch  11/2012 03:09:40 p.m. 

offline 

username |  messageID | message 
jwyvm_rdyt   54  <message to="jwyvm_rdyt" id="t4Wa4-291" type="chat" from="evn-az-3ju"><body>test1</body><thread>1a327531-5a1c-4d6b-8b66-1209cdabb77d</thread></message> 
jwyvm_rdyt   78  <message to="jwyvm_rdyt" id="t4Wa4-290" type="chat" from="evn-az-3ju"><body>Happy birthday</body><thread>1a327531-5a1c-4d6b-8b66-1209cdabb77d</thread></message> 
evn-az-3ju   89  <message to="evn-az-3ju" id="t4Wa4-290" type="chat" from="evn-az-3ju"><body>Happy birthday</body><thread>1a327531-5a1c-4d6b-8b66-1209cdabb77d</thread></message> 
zrObzh4um0   98  <message to="zrObzh4um0" id="t4Wa4-290" type="chat" from="evn-az-3ju"><body>Happy birthday</body><thread>1a327531-5a1c-4d6b-8b66-1209cdabb77d</thread></message> 
WyVm_rDYt   45  <message to="WyVm_rDYt" id="t4Wa4-290" type="chat" from="evn-az-3ju"><body>Happy birthday</body><thread>1a327531-5a1c-4d6b-8b66-1209cdabb77d</thread></message> 

roster 

username |    jid  |  date 
jwyvm_rdyt   evn-az-3ju  11/2012 03:09:40 p.m. 
jwyvm_rdyt   zrObzh4um0  12/2012 03:09:40 p.m. 
jwyvm_rdyt   bsMIAtWkhi  01/2013 03:09:40 p.m. 
zrObzh4um0   WyVm_rDYt  01/2013 03:09:40 p.m. 
WyVm_rDYt   zrObzh4um0  11/2012 03:09:40 p.m. 

这些是我想要得到这样设置表,

username |    realname  |  count 
evn-az-3ju   john      2 
zrObzh4um0   santa     0 
bsMIAtWkhi   mahesh     0 

我想知道所有用户名为'jwyvm_rdyt'的花名册jid以及他们的真实姓名和邮件数量,如果该邮件包含任何花名册jid。像'evn-az-3ju'在第54和78信件中,所以计数2为该花名册jid。

任何帮助将不胜感激。

+0

一般建议:_请_标准化您的'离线'表中的数据。就目前而言,我们必须找到一种方法来提取消息中的进出方,这可能只能通过自定义MySQL函数完成。 –

+0

您可以尝试将消息字段解释为xml,并使用'ExtractValue()'函数从xml中获取值。然而,我不清楚你真的在追求什么。 – Shadow

+0

@TimBiegeleisen感谢您回复..抱歉,我无法正常化数据库。我正在使用第三方数据库,我无法对数据库结构进行任何更改。 – user3588408

回答

0
select c.jid as username,c.realname,COUNT(NULLIF(TRIM(o.message), '')) as count from (select r.`jid`,u.realname from roster r join User u on r.jid=u.username where r.username='jwyvm_rdyt') c left join offline o on o.message like CONCAT('%', c.jid, '%') and o.username='jwyvm_rdyt' group by jid