2011-10-31 3 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 사용자에 대해 모든 새 LiveStream을 선택하려고 시도하고있는 경우 해당 사용자가 상대방에 연결된 경우에만 LiveStream을 검색해야합니다 (uc_IsPending =

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

그리고 위의와

는 DataTable을 지정된 C에 대한 실시간 스트리밍의 모든 새 항목을 반환해야합니다 : 0)

나는 다음과 같은 인수를 C#을 기능이 위의 요구 사항이 true 인 경우 urrentUser (ls_User).

이것은 페이스 북의 뉴스 피드와 비슷합니다. 친구들과 무슨 일이 일어나고 있는지 ... 오, 예, 누군가 (ls_User)가 (ls_Connection)에 대한 특정 이벤트를 초기화 할 때마다 tbl_LiveStream이 채워집니다.

나는 내 인생을 복잡하게 만들고 있는지 잘 모르겠지만 그게 내가 가지고있는 것이고 모든 도움을 주시면 감사하겠습니다.

내가 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

데이터베이스를 수정할 수 있습니까? 실제 요구 사항은 무엇입니까 (동일한 구조의 두 개의 서로 다른 테이블을 가지고 있다면 테이블을 꺼낼 가능성이 높습니다)? 아직 준비되지 않은 경우에는 병합 된 문자열이 아닌 준비된 명령문을 사용해야합니다 (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, Get Entities를 가져 오지 마십시오. 당신은 익숙하지 않을 수도있는 기술로 여기에서 조금 복잡해집니다. 현재 기존의 모든 데이터를 가져 와서 CSV 파일로 덤핑 한 다음 처음부터 응용 프로그램을 시작하여 Sharp Architecture과 같은 세부 정보를 추상화 할 수 있습니다.