TP5.x——聊天列表查询
前言
查询聊天列表,并返回最后一条聊天记录。这个有一个比较尴尬的点就是,一个是你主动发出的,一个是你接收的。
所以这个SQL会比较长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长!
步骤
查询出自己发的消息然后联合查询接收到的消息,这里要提下union的特性,就是两个合并的查询语句
- 字段数量必须一致!
- 字段顺序必须一致!
- 数据类型也要相似!
原始SQL
SELECT `uid`,`nickname`,`avatar`,`content`,`time` FROM (
    SELECT * FROM (
        SELECT toid as uid,`content`,`time` FROM `chat_log` WHERE ( fromid =1 )
        UNION
        SELECT fromid as uid,content,time FROM chat_log WHERE toid = 1
    ) `tmp` GROUP BY tmp.uid ORDER BY `tmp`.`time`
) `t` LEFT JOIN `chat_user` `u` ON `t`.`uid`=`u`.`id`
查询结果

改为TP5
整理思路也很简单,就是先进行**两次**sql语句的构造,然后用左连接查询.
 $sub = Db::name('log')
                ->field('toid as uid, content, time')
                ->where('fromid ='.$fromid)
                ->union('SELECT fromid as uid,content,time FROM chat_log WHERE toid = '.$fromid)
                ->buildSql();
            $query = Db::table($sub)
                ->alias('tmp')
                ->group('tmp.uid')
                ->order('tmp.time')
                ->buildSql();
            $info = DB::table($query)
                ->alias('t')
                ->field('uid,nickname,avatar,content,time')
                ->join('chat_user u', 't.uid=u.id', 'LEFT')
                ->select();
查询结果
{
    "status": true,
    "msg": "请求成功",
    "data": [
        {
            "uid": 2,
            "nickname": "立冬",
            "avatar": "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3667616433,706958275&fm=26&gp=0.jpg",
            "content": "1553187007",
            "time": 1553187000
        },
        {
            "uid": 3,
            "nickname": "立春",
            "avatar": "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3962805517,413692801&fm=26&gp=0.jpg",
            "content": "立春姐姐",
            "time": 1553187001
        },
        {
            "uid": 4,
            "nickname": "立夏",
            "avatar": "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=153106697,274998536&fm=26&gp=0.jpg",
            "content": "立夏姐姐",
            "time": 1553187002
        },
        {
            "uid": 5,
            "nickname": "小雨",
            "avatar": "https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=412473880,1796535308&fm=26&gp=0.jpg",
            "content": "小雨妹妹",
            "time": 1553187022
        }
    ]
}
TP5.x——聊天列表查询的更多相关文章
- SHAREPOINT - CAML列表查询
		首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表.文档库的查询,字段的定义,站点定义等处处使用的都是CAML. 简单的提一 ... 
- atitit.提升开发效率---MDA 软件开发方式的革命(5)----列表查询建模
		)----列表查询建模 1. 配置条件字段@Conditional 1 2. 配置条件字段显示类型为range----@Conditional(displayType = displayType.ra ... 
- 【Javascript】列表查询页面,简单地保存上一次查询的查询参数
		开发中经常做一些查询参数 + 列表参数的功能,这些功能有时候需提供导出Excel,或带超链接到其他明细页面的功能点. 在一些交互性要求严格的系统,需求方会要求: 用户第一个输入某些查询条件进行列表查询 ... 
- Moss列表查询,删除条目,更新条目。
		基于Query语句的列表查询 function retrieveListItems(itemId) { var siteUrl=_spPageContextInfo.webServerRelat ... 
- 【SSH系列】一步步深入springmvc+商品列表查询demo
		在前面的博文中,小编主要简单的介绍springmvc的体系结构.mvc模式的优缺点以及mvc框架,今天我们来继续学习springmvc的相关知识,在这篇博文中,小编讲解过springmvc的体系结构, ... 
- SharePoint中跨列表查询
		1,最近的项目中遇到一个需求,站点中有几十个列表,其中每5,6个列表属于一个模块下的.客户的需求是,首页上显示一个模块下所有列表数据的前5条,并按创建时间排序. 2,刚刚考虑到这块的实现方法时,用的是 ... 
- 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
		写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ... 
- Office365学习笔记—列表查询,删除条目,更新条目。
		1,基于Query语句的列表查询. function retrieveListItems(itemId) { var siteUrl=_spPageContextInfo.webServerRelat ... 
- (六)通过solr7的API实现商品的列表查询
		(六)通过solr7的API实现商品的列表查询 工具类: 获取 HttpSolrClient public class Constant { public static HttpSolrClient ... 
随机推荐
- UITableview 兼容IOS6 和IOS7的方法
			1. TableVIew向下拉44像素 添加Auto layout 2. Extended edge 选择Under top bars 2. 在Viewdidload中添加代码 if ([[UIDe ... 
- enote笔记语言(4)(ver0.3)——“5w1h2k”分析法
			章节:“5w1h2k”分析法 what:我想知道某个“关键词(keyword)”(即,词汇.词语,或称单词,可以是概念|专业术语|.......)的定义. why:我想知道事物发生的原因.“why ... 
- java面试题(转)
			1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ... 
- Tensorflow读取csv文件(转)
			常用的直接读取方法实例:#加载包 import tensorflow as tf import os #设置工作目录 os.chdir("你自己的目录") #查看目录 print( ... 
- 【codeforces 785D】Anton and School - 2
			[题目链接]:http://codeforces.com/contest/785/problem/D [题意] 给你一个长度为n的括号序列; 让你删掉若干个括号之后,整个序列变成前x个括号为左括号,后 ... 
- noip模拟赛 幻灯结界
			题目描述59式给你出了一道**题:有n个防御人(守方)还有n个攻击坦克(攻方)每个防御人有护甲a[i],而攻击方每个坦克有火力b[i]如果一个防守方的护甲不小于攻击方的攻击力,就可以防的住然而我们保持 ... 
- 清北学堂模拟赛d6t1 角谷猜想
			分析:不用删数字,我们考虑加入数字,维护一个栈,把不是4和7的数加进去,遇到3看栈顶是不是1,是的话弹出来就可以了. #include <bits/stdc++.h> #define N ... 
- UVa - 12661 - Funny Car Racing
			先上题目: 12661 Funny Car RacingThere is a funny car racing in a city with n junctions and m directed ro ... 
- hdu_1019_Least Common Multiple_201310290920
			Least Common Multiple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ... 
- imu 和 private redo
			在传统的undo管理模式中,Oracle对undo和data block是一视同仁.这样大致会有三种弊端: 1)事务开始时,存放事务表的段头不在内存,server process需要将此i/o上来 2 ... 
