2011-10-31 103 views
0

我已经创建了下面的表格:SQL SELECT从两个表(友谊)语句

表1:tbl_Connections

USE [taaraf_db] 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[tbl_Connections](
    [uc_Id] [int] IDENTITY(1,1) NOT NULL, 
    [uc_User] [nvarchar](50) NOT NULL, 
    [uc_Connection] [nvarchar](50) NOT NULL, 
    [uc_IsPending] [int] NOT NULL, 
    [uc_DateTime] [datetime] NOT NULL, 
CONSTRAINT [PK_tbl_Connections] PRIMARY KEY CLUSTERED 
(
    [uc_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 

ALTER TABLE [dbo].[tbl_Connections] ADD CONSTRAINT [DF_tbl_Connections_uc_IsPending] DEFAULT ((1)) FOR [uc_IsPending] 
GO 

表#2:tbl_LiveStream

USE [taaraf_db] 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[tbl_LiveStreams](
    [ls_Id] [int] IDENTITY(1,1) NOT NULL, 
    [ls_Story] [nvarchar](max) NOT NULL, 
    [ls_User] [nvarchar](50) NOT NULL, 
    [ls_Connection] [nvarchar](50) NOT NULL, 
    [ls_DateTime] [datetime] NOT NULL, 
CONSTRAINT [PK_tbl_LiveStreams] PRIMARY KEY CLUSTERED 
(
    [ls_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 

现在uc_User在tbl_Connections表示发起好友请求的用户,并且uc_Connection代表对方。 相同的概念上第二个表(tbl_LiveStreams)

我想选择一个cetrain用户的所有新的串流应用,流媒体直播应该仅当用户连接到对方特定用户检索(uc_IsPending = 0)

我有一个C#函数,采用下列参数:

public static DataTable GetAsyncLiveStream(string CurrentUser, int startAt, int howMany) { ... } 

而且上述,一个DataTable应该返回所有新项目在流媒体直播了给定的C urrentUser(ls_User)如果上述要求是真实的。

这有点像Facebook的新闻提要,什么是与朋友等发生...... 噢,tbl_LiveStream填充每当有人(ls_User)initates某种特定事件来(ls_Connection)。

我不确定我是否在这里使我的生活复杂化,但这就是我所有的帮助和赞赏。

我要指出,我已经通过从tbl_LiveStream所有返回的记录循环做到了这一点,做使用自定义类的函数.IsFriends()会去检查数据库中的友谊状态和编程一些验证填充一个DataTable ......我承认,这有点愚蠢。但我不知道如何做到这一点。

最后一件事, 我使用下面的查询返回有限的结果:

SELECT * FROM (
SELECT row_number() OVER (ORDER BY) AS rownum, ls_Id 
FROM) 
AS A 
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage) 

请帮忙,谢谢您的时间。

编辑 我想指出,这就是我如何从tbl_Connections表中获取谁是谁的朋友。

const string sql = "SELECT REPLACE((uc_Connection + uc_User), @CurrentUser, '') AS Connection " + 
         "FROM tbl_Connections Connection " + 
         "WHERE (@CurrentUser = uc_Connection) OR (@CurrentUser = uc_User)"; 
+0

你应该为此定义一个视图,即你的'row_number()'包装查询使用。到目前为止,你有什么? –

+0

我有我上面发布的内容......现在就是这样。我真的不知道如何开始。 – href

+2

你能修改数据库吗?你的实际需求是什么(如果你有两个不同的表格,[有效] _exact_相同的结构,你可能有一张桌子拉出来)?如果你还没有(SQL注入),你应该使用预处理语句,而不是连接字符串。表名不应以'tbl'为前缀(如果_everything_前缀无意义),并且列不应该以缩短的表名作为前缀(混淆,仅从一个表中选择时没有意义,并且您希望在从多个表中进行选择时使用别名无论如何)。 –

回答

0
SELECT * FROM (
SELECT row_number() OVER (ORDER BY) AS rownum, ls_Id 
FROM) 
AS A 
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage) 

这个语法是错误的。你不能这样做。使用联合,或使用LINQ to SQL。

从批判的角度来看,不要得到DataTables,得到实体。你似乎在这里复杂化很多,你可能不熟悉的技术。我建议将所有当前存在的数据转储到CSV文件中,然后从头开始使用类似Sharp Architecture的应用程序,这可以为您抽象出一些这些细节。