SQL --select a+b from table

今天作工程时,遇到了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 表的笛卡尔积)。

相关文章
相关标签/搜索