今天做工程时,遇到了select a+b from table的问题,记录下来。
工程需求:取出用户关注/粉丝表(t_user_follow)中某个用户A的粉丝数。
表设计如下
由表设计可知,用户A既可以在user_id_a位置,也可以在user_id_b位置,
follow_flag意义如下
00 -- A关注B
01 --A被B关注
02 --A、B相互关注
工程需求:现在要求查出id为1000000004的用户的粉丝数
思路:
1.先查出1000000004在A位置,关系为01、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 表的笛卡尔积)。