今天作工程時,遇到了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 表的笛卡爾積)。