2011-10-31 119 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的應用程序,這可以爲您抽象出一些這些細節。