SQL --select a+b from table

今天做工程时,遇到了select a+b from table的问题,记录下来。

工程需求:取出用户关注/粉丝表(t_user_follow)中某个用户A的粉丝数。

表设计如下

135408_9Lna_2312022.jpg

由表设计可知,用户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即结果如下

140613_nG0V_2312022.jpg

分析:查出的结果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 表的笛卡尔积)。


转载于:https://my.oschina.net/u/2312022/blog/598827

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值