今天作工程时,遇到了select a+b from table的问题,记录下来。
sql
工程需求:取出用户关注/粉丝表(t_user_follow)中某个用户A的粉丝数。性能
表设计以下设计
由表设计可知,用户A既能够在user_id_a位置,也能够在user_id_b位置,code
follow_flag意义以下
it
00 -- A关注B
table
01 --A被B关注class
02 --A、B相互关注select
工程需求:如今要求查出id为1000000004的用户的粉丝数方法
思路:im
1.先查出1000000004在A位置,关系为0一、02的个数
2.再查出1000000004在B位置,关系为00、02的个数
3.相加1结果和2结果
我写的sql以下
1.的SQL以下
SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_A = 1000000004 AND tuf.FOLLOW_FLAG in ('01','02')
2.的SQL以下
SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_B = 1000000004 AND tuf.FOLLOW_FLAG in ('00','02')
3.的SQL即结果以下
分析:查出的结果2是对的,可是我不知道为何会显示10条记录,这个记录数恰好和t_user_follow表中总记录数一致。
如是,我采用以下方法来使结果惟一
方法1:DISTINCT
SELECT DISTINCT ((SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_B = 1000000004 AND tuf.FOLLOW_FLAG in ('00','02'))+ (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_A = 1000000004 AND tuf.FOLLOW_FLAG in ('01','02'))) FROM t_user_follow
方法2:limit
SELECT (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_B = 1000000004 AND tuf.FOLLOW_FLAG in ('00','02'))+ (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_A = 1000000004 AND tuf.FOLLOW_FLAG in ('01','02')) FROM t_user_follow LIMIT 1
方法3:采用虚表dual
SELECT (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_B = 1000000004 AND tuf.FOLLOW_FLAG in ('00','02'))+ (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_A = 1000000004 AND tuf.FOLLOW_FLAG in ('01','02')) FROM DUAL
方法4:采用select ...格式,即不须要from子句
SELECT (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_B = 1000000004 AND tuf.FOLLOW_FLAG in ('00','02'))+ (SELECT COUNT(*) FROM t_user_follow tuf WHERE tuf.USER_ID_A = 1000000004 AND tuf.FOLLOW_FLAG in ('01','02'))
如上4种方法都能知足结果惟一性,就是不知道各类方法的性能咋样。还有步骤3的查询方法为何会出现10条记录?(缘由好像是带了from子句,没有带where子句,结果就是from 表的笛卡尔积)。