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 表的笛卡爾積)。

相關文章
相關標籤/搜索