求大神帮忙写一个sql

hackxx1992 2018-05-15 05:05:16
设计了一张公告表,一张用户是否已读表,现在考虑的是公告表一对多,如果用户在点开公告表明细的时候会同步在用户是否已读表插入一条已读的记录,现在需要查询公告列表,带有用户id和该公告是否已读标识。请大神帮忙看看。。

公告表:SELECT id,title,message,createTime FROM Sys_NoticeList
公告是否已读:SELECT uid,msgid,state FROM Sys_User_NoticeList
...全文
262 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2018-05-15
  • 打赏
  • 举报
回复

select *
from Sys_NoticeList A
left join 
(select * from Sys_User_NoticeList where uid=1) B on A.id=B.msgid

hackxx1992 2018-05-15
  • 打赏
  • 举报
回复
引用 10 楼 RINK_1 的回复:

select *
from Sys_NoticeList A
left join 
(select * from Sys_User_NoticeList where uid=1) B on A.id=B.msgid

感谢感谢,就是要这种!!!!!!
hackxx1992 2018-05-15
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
抱歉!!!!!!!! ==================================================== 1:create table xxx .. 语句 CREATE TABLE [dbo].[Sys_NoticeList]( [id] [INT] IDENTITY(1,1) NOT NULL, [title] [VARCHAR](50) NULL, [message] [VARCHAR](500) NULL, [show] [VARCHAR](50) NULL, [remark] [VARCHAR](500) NULL, [createTime] [DATETIME] NULL, CONSTRAINT [PK_Sys_Notice] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'标题' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'title' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'正文消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'message' GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'(''0 不显示 1 显示'')' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'show' GO CREATE TABLE [dbo].[Sys_User_NoticeList]( [id] [INT] IDENTITY(1,1) NOT NULL, [uid] [VARCHAR](50) NULL, [msgid] [VARCHAR](50) NULL, [state] [INT] NULL, [createTime] [DATETIME] NULL, CONSTRAINT [PK_Sys_User_NoticeList] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ==================================================== 2 insert into xxx ... 语句 INSERT INTO [dbo].[Sys_NoticeList] ([title] ,[message] ,[show] ,[remark] ,[createTime]) VALUES ('系统公告' ,'测试测试111111' ,1 ,'测试测试' ,GETDATE() ) GO INSERT INTO [dbo].[Sys_NoticeList] ([title] ,[message] ,[show] ,[remark] ,[createTime]) VALUES ('系统公告' ,'测试测试' ,1 ,'测试测试222222' ,GETDATE() ) GO INSERT INTO [dbo].[Sys_User_NoticeList] ([uid] ,[msgid] ,[state] ,[createTime]) VALUES (1 ,1 ,0 ,GETDATE()) INSERT INTO [dbo].[Sys_User_NoticeList] ([uid] ,[msgid] ,[state] ,[createTime]) VALUES (1 ,2 ,0 ,GETDATE()) ====================================================== 3.想要的结果是select .... (此处为查询语句) where uid = 1 此处的uid = 1 是不固定的,比如说用户uid为10的这里会传入10 id title message createTime state 3 系统通知 银联快捷积分A通道上线 2018-04-24 00:00:00.000 0 4 系统通知 尊敬的秒速会员:银联快捷C通道支持所有银行卡 2018-05-14 00:00:00.000 1 ======================================================== 4.数据库为MSSQL server 2012
二月十六 版主 2018-05-15
  • 打赏
  • 举报
回复
建议楼主列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
二月十六 版主 2018-05-15
  • 打赏
  • 举报
回复
看不明白楼主的规则啊。
测试数据和结果。
数据是
id name state
1 张三 0

结果是:
id name state
1 张三 01

就这样。。。。。。
hackxx1992 2018-05-15
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
如果是已读了,点开公告表明细的时候还会再同步一次吗?会出现一个公告一个人多次读取的情况吗?
不允许多次插入已读标识的,插入之前会做一次判断的,只有state为0 也就是说已读标识表里面没有某用户对应某条公告数据的时候才做插入操作
hackxx1992 2018-05-15
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
[quote=引用 3 楼 hackxx1992 的回复:]
[quote=引用 2 楼 sinat_28984567 的回复:]
建议楼主给出测试数据和想要的结果
SELECT id,
title,
message,
createTime,
uid,
msgid,
state
FROM Sys_NoticeList
LEFT JOIN Sys_User_NoticeList
ON Sys_NoticeList.id = Sys_User_NoticeList.msgid;
这样写我会的呢,我的想法是能不能查询的时候跟上uid 然后查询出对应的带有是否已读标识的列表信息

比如说:select .... where uid = 1 然后会查询出公告信息,如果 Sys_User_NoticeList表里面没有uid为1的已读标识 查询出来的数据state就为0 反之某一条公告有对应的已读标识,则state就为1[/quote]
可以这样查询。给出测试数据和想要的结果,给你写
[/quote]
非常感谢!!!!




SQL:

CREATE TABLE [dbo].[Sys_NoticeList](
[id] [INT] IDENTITY(1,1) NOT NULL,
[title] [VARCHAR](50) NULL,
[message] [VARCHAR](500) NULL,
[show] [VARCHAR](50) NULL,
[remark] [VARCHAR](500) NULL,
[createTime] [DATETIME] NULL,
CONSTRAINT [PK_Sys_Notice] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'标题' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'title'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'正文消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'message'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'(''0 不显示 1 显示'')' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_NoticeList', @level2type=N'COLUMN',@level2name=N'show'
GO

CREATE TABLE [dbo].[Sys_User_NoticeList](
[id] [INT] IDENTITY(1,1) NOT NULL,
[uid] [VARCHAR](50) NULL,
[msgid] [VARCHAR](50) NULL,
[state] [INT] NULL,
[createTime] [DATETIME] NULL,
CONSTRAINT [PK_Sys_User_NoticeList] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
二月十六 版主 2018-05-15
  • 打赏
  • 举报
回复
引用 3 楼 hackxx1992 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 建议楼主给出测试数据和想要的结果
SELECT id,
       title,
       message,
       createTime,
       uid,
       msgid,
       state
FROM Sys_NoticeList
    LEFT JOIN Sys_User_NoticeList
        ON Sys_NoticeList.id = Sys_User_NoticeList.msgid;
这样写我会的呢,我的想法是能不能查询的时候跟上uid 然后查询出对应的带有是否已读标识的列表信息 比如说:select .... where uid = 1 然后会查询出公告信息,如果 Sys_User_NoticeList表里面没有uid为1的已读标识 查询出来的数据state就为0 反之某一条公告有对应的已读标识,则state就为1[/quote] 可以这样查询。给出测试数据和想要的结果,给你写
hackxx1992 2018-05-15
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
建议楼主给出测试数据和想要的结果
SELECT id,
       title,
       message,
       createTime,
       uid,
       msgid,
       state
FROM Sys_NoticeList
    LEFT JOIN Sys_User_NoticeList
        ON Sys_NoticeList.id = Sys_User_NoticeList.msgid;
这样写我会的呢,我的想法是能不能查询的时候跟上uid 然后查询出对应的带有是否已读标识的列表信息 比如说:select .... where uid = 1 然后会查询出公告信息,如果 Sys_User_NoticeList表里面没有uid为1的已读标识 查询出来的数据state就为0 反之某一条公告有对应的已读标识,则state就为1
二月十六 版主 2018-05-15
  • 打赏
  • 举报
回复
建议楼主给出测试数据和想要的结果
SELECT id,
       title,
       message,
       createTime,
       uid,
       msgid,
       state
FROM Sys_NoticeList
    LEFT JOIN Sys_User_NoticeList
        ON Sys_NoticeList.id = Sys_User_NoticeList.msgid;
二月十六 版主 2018-05-15
  • 打赏
  • 举报
回复
如果是已读了,点开公告表明细的时候还会再同步一次吗?会出现一个公告一个人多次读取的情况吗?

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧