WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   hitta nivå bland lista (https://www.wn.se/forum/showthread.php?t=1055225)

frecka 2012-10-04 19:11

hitta nivå bland lista
 
har en lista som ser ut såhär:

0
10
50
100
200
500
1000

om en person har värdet 75 hamnar han på 50 nivån
om en person har värdet 100 hamnar han på 100 nivån
Om en person har värdet 0 hamnar han på 0 nivån

Hur kan jag enklast veta vilken nivå en användare är på om den har ett visst värde.

Detta kan gärna göras som en SQL fråga annars går pseudo bra

nosnaj 2012-10-04 19:41

select max(level_limits) where user_points >= level_limits;

Otestad kod, men känns rätt i mitt huvud :-)

Conny Westh 2012-10-04 20:00

Logiken i nedan pseudocode funkar så att när den väl hittar en match så hoppar den vidare till slutet av funktionen.


Pseudocode:
Kod:

begin function getLevel(value)
    if (value>=1000)
        level=1000
    elseif (value>=500)
        level=500
    elseif (value>=200)
        level=200
    elseif (value>=100)
        level=100
    elseif (value>=50)
        level=50
    elseif (value>=10)
        level=10
    else
        level=0
    endif
    return level
end function


frecka 2012-10-04 20:20

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20452232)
Logiken i nedan pseudocode funkar så att när den väl hittar en match så hoppar den vidare till slutet av funktionen.


Pseudocode:
Kod:

begin function getLevel(value)
    if (value>=1000)
        level=1000
    elseif (value>=500)
        level=500
    elseif (value>=200)
        level=200
    elseif (value>=100)
        level=100
    elseif (value>=50)
        level=50
    elseif (value>=10)
        level=10
    else
        level=0
    endif
    return level
end function


Det går inte att göra på något smidigare sätt om det finns runt 100 olika nivåer?

dAEk 2012-10-04 20:23

Citat:

Ursprungligen postat av frecka (Inlägg 20452235)
Det går inte att göra på något smidigare sätt om det finns runt 100 olika nivåer?

nosnajs kod borde funka om du bara rättar syntaxen.

nosnaj 2012-10-04 20:43

Citat:

Ursprungligen postat av dAEk (Inlägg 20452236)
nosnajs kod borde funka om du bara rättar syntaxen.

Glömde visst tabellen såg jag nu, men något liknande borde funka bättre.

select max(level_limits) from level_limits_table where user_points >= level_limits;

Conny Westh 2012-10-04 20:57

Här kommer lite SQL-kod som jag testat i MS SQL-server 2008 R2, har sånt sabla problem att få MySQL 5.5.28.2 att fungera.


Kod:


-- Följande är SQL för att skapa tabellen LevelDefinitions i MSSQL-server 2008 R2
USE [wntest]
GO

/****** Object:  Table [dbo].[LevelDefinition]    Script Date: 10/04/2012 20:42:01 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Skapa tabellen med DDL-script
CREATE TABLE [dbo].[LevelDefinition](
        [Level] [int] NOT NULL,
        [LowValue] [int] NULL,
        [HighValue] [int] NULL,
 CONSTRAINT [PK_LevelDefinition] PRIMARY KEY CLUSTERED
(
        [Level] 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


Kod:

-- Lägg upp definitionen av alla tabellerna
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 1000,1000,999999
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 500,500,999
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 200,200,499
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 100,100,199
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 50,50,99
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 10,10,49
INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
SELECT 0,0,9
GO

Kod:

-- kolla innehållet i hela tabellen, så det ser ut att vara OK
select * from LevelDefinition

Kod:

-- Så här får man fram rätt LEVEL
select Max(Level) from LevelDefinition where 75>=LowValue;


Conny Westh 2012-10-05 01:36

Här kommer lite stored procedures som kan vara till hjälp:

Kod:

CREATE PROCEDURE [dbo].[LevelInsert]
        @Level int,
        @LowValue int,
        @HighValue int
AS
BEGIN
        INSERT INTO [dbo].[LevelDefinition] ([Level],[LowValue],[HighValue])
        SELECT @Level,@LowValue,@HighValue
END
GO

CREATE PROCEDURE [dbo].[LevelUpdate]
        @Level int,
        @LowValue int,
        @HighValue int
AS
BEGIN
        UPDATE [dbo].[LevelDefinition]
        SET
        [LowValue]=@LowValue,
        [HighValue]=@HighValue
        WHERE [Level]=@Level
END
GO

CREATE PROCEDURE [dbo].[LevelDelete]
        @Level int
AS
BEGIN
        DELETE [dbo].[LevelDefinition]
        WHERE [Level]=@Level
END
GO

CREATE PROCEDURE [dbo].[LevelInit]
AS
BEGIN
        EXEC [dbo].[LevelInsert] 1000,1000,999999;
        EXEC [dbo].[LevelInsert] 500,500,999;
        EXEC [dbo].[LevelInsert] 200,200,499;
        EXEC [dbo].[LevelInsert] 100,100,199;
        EXEC [dbo].[LevelInsert] 50,50,99;
        EXEC [dbo].[LevelInsert] 10,10,49;
        EXEC [dbo].[LevelInsert] 0,0,9;
END
GO


foks 2012-10-05 07:39

Citat:

Ursprungligen postat av nosnaj (Inlägg 20452231)
select max(level_limits) where user_points >= level_limits;

Otestad kod, men känns rätt i mitt huvud :-)

Det ser helt rätt ut, och till skillnad från ConnyWesths förslag behöver man bara använda en kolumn i tabellen. Vad jag kan se använder ConnyWesth inte alls HighValue.

Conny Westh 2012-10-05 08:24

Min modell av det hela är mer generell och öppen för utbyggnad och flexibilitet.

Bland annat kan man använda en benämning på nivåerna som är helt oberoende från värdet på poängen i tabellen. Man kan på ett enkelt sätt justera beräkningen av vilken nivå man hamnar på i en enskild SP utan att ändra en rad i programkoden. Enbart en ändring i SPn räcker.


Alla tider är GMT +2. Klockan är nu 15:37.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson