Je possède ce tableauSQL Server CTE récursive et la pagination
CREATE TABLE [dbo].[friend_blocked_list](
[subdomain] [varchar](50) NOT NULL,
[un] [nvarchar](50) NOT NULL,
[friend] [nvarchar](50) NOT NULL,
[is_blocked] [bit] NOT NULL,
[approved] [bit] NOT NULL)
où je sélectionne des données avec de dessous requête. Sélectionnez requête combine utilisateurs ajoutés par l'utilisateur comme ami et les utilisateurs qui ont été ajoutés comme ami par l'utilisateur
declare @un varchar(50), @subdomain varchar(50)
set @un='user2';
set @subdomain ='test.domain.com';
WITH FRIENDS as
(
SELECT friend
FROM friend_blocked_list
WHERE [email protected] and [email protected] and approved=1 and is_blocked=0
UNION ALL
SELECT un as friend
FROM friend_blocked_list
WHERE [email protected] and [email protected] and approved=1 and is_blocked=0
)
select friend from FRIENDS group by FRIENDS.friend order by FRIENDS.friend asc
Il fonctionne très bien avec une petite amout de données, mais je veux être en mesure de faire une recherche de personnes sur le côté serveur afin pour réduire la charge. J'essaie de le combiner avec mon paging sp ci-dessous
create PROCEDURE [dbo].[Paging]
@subdomain varchar(50),
@un varchar(50),
@PageNumber int,
@PageSize int
AS
BEGIN
--paging
DECLARE @FirstRow INT,@LastRow INT,@RowCount INT,@PageCount INT
--find recordcount and pages
SELECT @RowCount = COUNT(*), @PageCount = COUNT(*)/@PageSize
FROM friend_blocked_list
WHERE [email protected] AND [email protected] AND approved=1 AND is_blocked=0;
--- calculate pages
IF @RowCount % @PageSize != 0 SET @PageCount = @PageCount + 1
IF @PageNumber < 1 SET @PageNumber = 1
IF @PageNumber > @PageCount SET @PageNumber = @PageCount
SELECT
CurrentPage = @PageNumber,
TotalPages = @PageCount,
TotalRows = @RowCount
-- mora calculation
SELECT @FirstRow = (@PageNumber - 1) * @PageSize + 1,
@LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;
WITH MyTopics AS
(
SELECT *, ROW_NUMBER() OVER (order by un asc) AS RowNumber
FROM friend_blocked_list
WHERE [email protected] AND [email protected] AND approved=1 AND is_blocked=0
)
SELECT *
FROM MyTopics
WHERE RowNumber BETWEEN @FirstRow AND @LastRow
ORDER BY RowNumber ASC;
end
Mais comme toujours j'ai des problèmes :). Le principal problème est le UNION ALL
dans ma requête. Il m'empêche d'utiliser ROW_NUMBER() OVER
.
Des idées?
Quel genre d'information auriez-vous besoin sur la table FRIEND_BLOCKED_LIST? – nLL
également dans le deuxième sélectionnez après l'union tout ce qu'il devrait être OÙ t.friend = @UN istead de OÙ t.un = @UN ne sont donc pas des requêtes identiques – nLL
liste de colonne si elle est pas très longue et quelle est votre logique pour UNION sur FRIEND_BLOCKED_LIST. La requête en l'état ressemble à renvoyer FRIEND_BLOCKED_LIST.friend et FRIEND_BLOCKED_LIST.un pour la même personne (?). Ce n'est pas clair ce qui se passe dans la table. –