以上两张表分别A,B想找出A表中所有authorid为8的记录,并在每条记录结果栏中关联显示出B表内的数据select `a`.`id`,`a`.`sourcename`,`a`.`authorid`, b.id AS b__id,b.uid AS b__uid,b.cid AS b__cid from `ts_wffiles` a LEFT JOIN `ts_checkin` b on a.id=b.cid where a.authorid=8 GROUP BY id order by id desc得出的结果是:
我想要得到的结果是红色框中的记录应该为上个图中红色框内的记录,也就是取出B表中ID为10的记录,这里取出的是ID为9
但是如果我在WHERE后面连接一个and b.uid=8,却又把left join取出来的A表记录过滤了下,我想保持A表中的所有记录的同时把B表中符合uid=8的记录取出来。
求SQL写法

解决方案 »

  1.   

    你用  LEFT JOIN ,能查出a表的所有数据。而a.id=b.cid 且GROUP BY id(理应为GROUP BY a.id),说明你将表b的多条cid相同的数据group by 分组了。分组留下的一条数据,官方给的回复是ANY_VALUE()。也就是说,分组后返回的数据没法指定。
    如果你非要指定返回哪一条数据,只能先处理表b的分组。表b分组选取id大的为返回数据
    (SELECT max(id) FROM `ts_checkin`  GROUP BY cid)表b返回只剩分组中id大的数据的完整表,用此表代替`ts_checkin` 
    (SELECT * FROM `ts_checkin`  WHERE id IN (SELECT max(id) FROM `ts_checkin`  GROUP BY cid))完整的语句
    select `a`.`id`,`a`.`sourcename`,`a`.`authorid`, b.id AS b__id,b.uid AS b__uid,b.cid AS b__cid from `ts_wffiles` AS a LEFT JOIN (SELECT * FROM `ts_checkin`  WHERE id IN (SELECT max(id) FROM `ts_checkin`  GROUP BY cid)) AS b on a.id=b.cid where a.authorid=8 GROUP BY id order by id desc以上方法,只能返回表b的id大的数据。如果表b的cid参数相同的数据很多,分组之后,你想返回任意一条数据,那你就另外处理表b的分组。越复杂对性能越有影响。