功能是:查询出所有的记录,根据tbUser_Name得知用户是否收藏过这条记录,收藏过就将Flag=1,没有收藏过就将 flag=0
ID name MSG tbUser_Username
20130405bAA 李 欣赏ffff weiwei
20130405bAA 李 欣赏ffff latlong
20130405bAB 李 你好 Null
20130405bAC 李 收到了 latlong
20130405bAD 李 可以关闭了 Null【注】:
上面是个视图,是由两个表组成的。
我要查询tbUser_Username='weiwei'的,查询出的结果
ID name MSG Flag
20130405bAA 李 欣赏ffff 1
20130405bAB 李 你好 0
20130405bAC 李 收到了 0
20130405bAD 李 可以关闭了 0
这条记录因为weiwei没有收藏过,所以就将flag=0, => 20130405bAC 李 收到了 latlong
ID name MSG tbUser_Username
20130405bAA 李 欣赏ffff weiwei
20130405bAA 李 欣赏ffff latlong
20130405bAB 李 你好 Null
20130405bAC 李 收到了 latlong
20130405bAD 李 可以关闭了 Null【注】:
上面是个视图,是由两个表组成的。
我要查询tbUser_Username='weiwei'的,查询出的结果
ID name MSG Flag
20130405bAA 李 欣赏ffff 1
20130405bAB 李 你好 0
20130405bAC 李 收到了 0
20130405bAD 李 可以关闭了 0
这条记录因为weiwei没有收藏过,所以就将flag=0, => 20130405bAC 李 收到了 latlong
CASE tbUser_Username WHEN 'weiwei' THEN 1 ELSE 0 END AS Flag
FROM 视图
with tb as
(
select distinct ID, name, MSG
from table
)
select tb.*, case WHEN table.ID IS NOT NULL THEN 1 ELSE 0 END as Flag
from tb
left outer join table on table.ID = tb.ID
and table.tbUser_Username = 'weiwei'
ID name MSG
20130405bAA 李 欣赏ffff
20130405bAB 李 你好
20130405bAC 李 收到了
20130405bAD 李 可以关闭了
表tbFav
tbUser_Username tbMessage_ID
weiwei 20130405bAA
latlong 20130405bAA
latlong 20130405bAC
上面两个表。 查weiwei 时, 一定要把20130405bAC 这条记录查出来,将flag标记为0 意思是没收藏的标记为0 ,收藏了的标记为1
SELECT ID, name, MSG,
CASE tbUser_Username WHEN 'weiwei' THEN 1 ELSE 0 END AS Flag
FROM 视图
这样写就会出现重复记录。
20130405bAA 李 欣赏ffff flag=1
20130405bAA 李 欣赏ffff flag=0这两条记录我只要flag=1 的。
20130405bAA 李 欣赏ffff 1
20130405bAB 李 你好 0
20130405bAC 李 收到了 0
20130405bAD 李 可以关闭了 0查询atlong 结果为
ID name MSG flag
20130405bAA 李 欣赏ffff 1
20130405bAB 李 你好 0
20130405bAC 李 收到了 1
20130405bAD 李 可以关闭了 0查询 XXX 结果为
ID name MSG flag
20130405bAA 李 欣赏ffff 0
20130405bAB 李 你好 0
20130405bAC 李 收到了 0
20130405bAD 李 可以关闭了 0
(
Id CHAR(11) ,
Name VARCHAR(50) ,
Msg VARCHAR(50)
);
INSERT INTO @tbMessage
( Id, Name, Msg )
VALUES ( '20130405bAA', '李', '欣赏ffff' ),
( '20130405bAB', '李', '你好' ),
( '20130405bAC', '李', '收到了' ),
( '20130405bAD', '李', '可以关闭了' );
DECLARE @tbFav TABLE
(
tbUser_Username VARCHAR(50) ,
tbMessage_ID CHAR(11)
);INSERT INTO @tbFav
( tbUser_Username, tbMessage_ID )
VALUES ( 'weiwei', '20130405bAA' ),
( 'latlong', '20130405bAA' ),
( 'latlong', '20130405bAC' );DECLARE @UserName VARCHAR(50);
SET @UserName = 'weiwei';SELECT m.* ,
CASE WHEN t.tbMessage_ID IS NULL THEN 0
ELSE 1
END
FROM @tbMessage m
OUTER APPLY ( SELECT TOP 1
*
FROM @tbFav f
WHERE m.id = f.tbMessage_ID
AND tbUser_Username = @UserName
) AS t;
(CASE WHEN EXISTS(SELECT 1 FROM #tbFav WHERE ID=a.ID AND tbUser_Username='weiwei') THEN 1 ELSE 0 END) Flag
FROM #tbMessage a
只是,where条件有点小问题SELECT a.* ,
( CASE WHEN EXISTS ( SELECT 1
FROM @tbFav
WHERE tbMessage_ID = a.Id
AND tbUser_Username = @UserName ) THEN 1
ELSE 0
END ) Flag
FROM @tbMessage a
FROM tbMessage a LEFT JOIN
(SELECT ID, 1 AS Flag FROM tbFav
WHERE tbUser_Username='weiwei'
) b ON a.ID=b.ID
select ID,name,msg,flag=case when tbuser_username='weiwei' then 1 else 0 end
from tbmessage left join tbfav
on tbmessage.id=tbfav.tbmessage_id and tbuser_username='weiwei'
但是,如果我们也希望不带上tbUser_Username,而只是简单地查找这条记录是否被收藏过,这种写法会产生多出来的记录。
select id,name,msg,max(count) flag from (
select *,1 count from tbUser where username='weiwei' group by id
union all
select *,0 count from tbUser
) t group by id;
SELECT ID, name, MSG,
max(CASE username WHEN 'weiwei' THEN 1 ELSE 0 END) AS Flag
FROM tbUser GROUP BY ID;