mysql - sql无法弄清楚查询

标签 mysql sql

我有三个表:

CREATE TABLE IF NOT EXISTS `contacts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `providerId` int(10) unsigned NOT NULL DEFAULT '0',
  `requestId` int(10) unsigned NOT NULL DEFAULT '0',
  `status` binary(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `fromuid` int(255) NOT NULL,
  `touid` int(255) NOT NULL,
  `sentdt` datetime NOT NULL,
  `read` tinyint(1) NOT NULL DEFAULT '0',
  `readdt` datetime DEFAULT NULL,
  `messagetext` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
)

CREATE TABLE IF NOT EXISTS `users` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `mobile` varchar(15) NOT NULL,
  `password` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `zip` varchar(15) DEFAULT NULL,
  `device` varchar(50) DEFAULT NULL,
  `version` varchar(10) DEFAULT NULL,
  `photo` varchar(255) DEFAULT NULL,
  `created` datetime NOT NULL,
  `live` enum('0','1') NOT NULL DEFAULT '1',
  `authenticationTime` datetime NOT NULL,
  `userKey` varchar(255) DEFAULT NULL,
  `IP` varchar(50) DEFAULT NULL,
  `port` int(10) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `firstname` (`mobile`,`city`,`zip`)
)

此 SQL 查询为指定用户(在本例中为用户 ID 1)查找好友/联系人:

SELECT u.id
   ,u.mobile
   ,u.name
   ,(NOW() - u.authenticationTime) AS authenticateTimeDifference
   ,u.IP
   ,f.providerid
   ,f.requestid
   ,f.status
   ,u.port
FROM contacts f
LEFT JOIN users u ON u.id =
IF (
      f.providerid = 1
      ,f.requestid
      ,f.providerid
      ) WHERE (
      f.providerid = 1
      AND f.status = 1
      )
   OR f.requestid = 1

这很好用,但我希望还可以加入消息表,并显示用户的最近交谈过的 friend /联系人(意思是最新的对话优先)与order by messages.sentdt desc 选项,但我不知道该怎么做,我尝试了所有连接,但都没有成功:(

非常感谢您的帮助。谢谢

更新

下面是查询返回的示例数据:

enter image description here

在那个 same 结果集中,我希望能够根据 order by messages.sentdt desc 进行排序,但我不确定如何将其拉入并对结果集进行排序最新消息优先

最佳答案

试试这个:

  select u.id
      , u.mobile
      , u.name
      , (NOW() - u.authenticationTime) as authenticateTimeDifference
      , u.IP
      , f.providerid
      , f.requestid
      , f.status
      , u.port
    from contacts f
    left join users u
      on u.id = if (f.providerid = 1, f.requestid, f.providerid)
    left join (select fromuid, max(sentdt) as sentdt from messages group by fromuid) m 
      on m.fromuid =  if (f.providerid = 1, f.providerid, f.requestid)
    where (f.providerid = 1 and f.status = 1) 
        or f.requestid = 1
    order by m.sentdt

关于mysql - sql无法弄清楚查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27533838/

相关文章:

mysql - 为什么这个 timestampdiff() 得到 NULL?

mysql - 优化 MySQL count(*) 查询

sql - LEFT JOIN 最多为一对多关系返回一行

sql - 合并两个表,按比例交错两个表的选择查询结果

java - 我如何在mysql中存储图像?

mysql - 如何从连接键不在连接表中的表中检索值

sql - 替换字符串中的多个字符,而不使用任何嵌套替换函数

mysql - SQL 按不同字段排序

mysql - Netbeans - "Entity Classes from Database"创建空类文件

c# - 将字节数组上传到MYSQL