2012-10-04, 19:11
|
#1
|
|
Flitig postare
Reg.datum: Apr 2011
Inlägg: 410
|
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
|
2012-10-04, 19:41
|
#2
|
|
Mycket flitig postare
Reg.datum: Mar 2005
Inlägg: 822
|
select max(level_limits) where user_points >= level_limits;
Otestad kod, men känns rätt i mitt huvud :-)
|
2012-10-04, 20:00
|
#3
|
|
Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 4 245
|
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
__________________
Senior Backend Systemutvecklare (sedan 1988) med inriktning mot Microsoft .NET (C#, VB.NET, C, C++, J# och F#) , men även en del Java SE samt databasmodellering i SQL-server. Konsultar.
--> Höjden av optimism - Det är att utrusta en programmerare med kulspetspenna! <--
Senast redigerad av ConnyWesth den 2012-10-04 klockan 20:02
|
2012-10-04, 20:20
|
#4
|
|
Flitig postare
Reg.datum: Apr 2011
Inlägg: 410
|
Citat:
Ursprungligen postat av ConnyWesth
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?
|
2012-10-04, 20:23
|
#5
|
|
Mycket flitig postare
Reg.datum: Dec 2006
Inlägg: 579
|
Citat:
Ursprungligen postat av frecka
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.
|
2012-10-04, 20:43
|
#6
|
|
Mycket flitig postare
Reg.datum: Mar 2005
Inlägg: 822
|
Citat:
Ursprungligen postat av dAEk
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;
|
2012-10-04, 20:57
|
#7
|
|
Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 4 245
|
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;
__________________
Senior Backend Systemutvecklare (sedan 1988) med inriktning mot Microsoft .NET (C#, VB.NET, C, C++, J# och F#) , men även en del Java SE samt databasmodellering i SQL-server. Konsultar.
--> Höjden av optimism - Det är att utrusta en programmerare med kulspetspenna! <--
|
2012-10-05, 01:36
|
#8
|
|
Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 4 245
|
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
__________________
Senior Backend Systemutvecklare (sedan 1988) med inriktning mot Microsoft .NET (C#, VB.NET, C, C++, J# och F#) , men även en del Java SE samt databasmodellering i SQL-server. Konsultar.
--> Höjden av optimism - Det är att utrusta en programmerare med kulspetspenna! <--
|
2012-10-05, 07:39
|
#9
|
|
VIP
Reg.datum: Apr 2003
Inlägg: 689
|
Citat:
Ursprungligen postat av nosnaj
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.
|
2012-10-05, 08:24
|
#10
|
|
Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 4 245
|
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.
__________________
Senior Backend Systemutvecklare (sedan 1988) med inriktning mot Microsoft .NET (C#, VB.NET, C, C++, J# och F#) , men även en del Java SE samt databasmodellering i SQL-server. Konsultar.
--> Höjden av optimism - Det är att utrusta en programmerare med kulspetspenna! <--
|
|
Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
|
|
|
| Ämnesverktyg |
|
|
| Visningsalternativ |
Linjär visning
|
Regler för att posta
|
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg
HTML-kod är av
|
|
|
Alla tider är GMT +2. Klockan är nu 13:51.
| |
|