ObbelixMedlem sedan okt. 2002257 inlägg Håller på med ett system för en hockeyturnering där det förmodlingen kommer bli så att en spelare kan ha flera nummer under turneringes gång. Så jag har gjort en separat tabell som hanterar alla spelares tröjnummer. Allt lugnt så långt men nu vill jag ju så klart på översikten på spelarna sortera dessa efter just tröjnummer. Dessutom ska alla nummer den spelaren haft finnas med, så i min hjärna går det inte med en "inner join" av den typ jag kan.
Tabellerna ser ut som följer:
Players
-id
-tournament_id
-player_name
-player_born
etc...
Players_numbers
-id
-player_id
-player_number
Det jag vill är alltså att kunna loopa ut alla spelare med dess nummer sorterat på just nummer, ex:
2 - Olle Olsson
3, 5 - Pelle Persson
4, 12 - Sven Svensson
Men hur ska SQL satsen se ut?
@ndersMedlem sedan juni 200032 969 inlägg I SQL-frågan räcker det bra med en vanlig inner join. När du sedan i ASP-koden loopar fram datat, så får du sätta en kontrollvariabel så du kan ha koll på när det kommer en ny spelare, eller ett nytt tröjnummer på samma spelare.
LarsGMedlem sedan dec. 200012 464 inlägg select playerName,player_number,
(select min(player_number)
from player_numbers
where player_id = p.player_id) as shirtNumber
from Players as p inner join Players_numbers pn
on p.player_id = pn.player_id
order by shirtNumber
Flyttas från ASP
ObbelixMedlem sedan okt. 2002257 inlägg Tack, men det funkar inte riktigt som önskat.
Om jag har en spelare med tre olika tröjnummer blir det följande:
1 - Olle
1 - Olle
1 - Olle
fast Olle har nummer 1,2 och 3.
LarsGMedlem sedan dec. 200012 464 inlägg Om du har så borde frågan returnera
OLLE 1 1
OLLE 2 1
OLLE 3 1
Om du vill presentera det på en rad så får hantera det i din applikation.
ObbelixMedlem sedan okt. 2002257 inlägg Fel av mig tidigare.
Nu får jag ut det som du skriver, men vill ju ha som i mitt första inlägg. Och där är det tvärstopp. Så nu kanske tråden ligger i fel forum igen :) Eller kan man direkt från SQL frågan få ut numren kommaseparerad?
Jag får som sagt ut:
1 Olle
2 Olle
3 Olle
2 Pelle
4 Pelle
Men vill ha ut:
1,2,3 Olle
2,4 Pelle
nummer och namn på samma rad dock inom olika "<td>"
LarsGMedlem sedan dec. 200012 464 inlägg Det går att ordna direkt i SQL men ser lite olika ut beroende på DBMS.
För att göra det i ASP
pName = ""
cnt = 0
while not rs.eof
if pName <> rs("player_name") then
if pName <> "" then response.write "<br>"
pname = rs("player_name")
response.write pname
cnt = 0
end
if cnt > 0 then response.write ", "
response.write rs("player_number")
cnt = cnt + 1
rs.movenext
wend
if pName <> "" then response.write "<br>"
ObbelixMedlem sedan okt. 2002257 inlägg Fick göra om den lite för att få numren före namnet.
while not rs.eof
if pName <> rs("player_name") then
if pName <> "" then
response.Write("<br>" & nummer & pName)
nummer = ""
pName = ""
end if
pname = rs("player_name")
cnt = 0
end if
if cnt > 0 then nummer = nummer & ","
nummer = nummer & rs("player_number")
cnt = cnt + 1
rs.movenext
wend
if pName <> "" then response.write("<br>" & nummer & pName)
Går säkert att göra på annat sätt, men denna funkar.
Använder MSSQL så om det går att få till det drekt i frågan kanske det är smidigare än all denna kod?
LarsGMedlem sedan dec. 200012 464 inlägg Du får skriva en function
create function wetShirts(@player_id int)
returns varchar(100)
as
begin
declare @s varchar(100)
select @s = coalesce(@s + ',','') + cast(player_number as varchar(5))
from player_numbers
where player_id = @player_id
return @s
end
select player_name,wetShirts(player_id),
(select min(player_number)
from player_numbers
where player_id = p.player_id) as shirtNumber
from Players
order by shirtNumber
ObbelixMedlem sedan okt. 2002257 inlägg Ok.
Är inte värst hemma på MSSQL (första projektet med MSSQL) men som jag förstår är det alltså en "User Defined Function" som ska göras m.h.a Enterprise manager? Har i alla fall testat att göra en där och syntax säger ok.
Har även satt att användaren får accessa funktionen men får följande fel när jag kör sql-satsen i asp:
Microsoft OLE DB Provider for SQL Server error '80040e14'
'wetShirts' is not a recognized function name.
Ändå heter funktionen just wetShirts.
SQL frågan utskriven är följande:
SELECT p.player_name,wetShirts(p.id), (SELECT min(player_number)
FROM player_numbers where player_id = p.id) as
shirtNumber from Players p ORDER BY shirtNumber ASC
Behöver det göras nåt mer?
LarsGMedlem sedan dec. 200012 464 inlägg Kom just på en sak, när man anropar egendefinierade funktioner i SQL server så måste man alltid ange namnet på den som skapat funktionen
select ..., obbelix.wetshirts(player_id), ...
eller vilket användarnamn du nu har.
Jag glömmer alltid bort det (eftersom det inte är standard bla bla och ointuivt bla bla och inte fungerar så i den DBMS jag använder bla bla).
ObbelixMedlem sedan okt. 2002257 inlägg WOHOO!
Funkar perfekt. Tackat tackar!
Tror jag kör den i stället för den med massa kod (som i vissa fall blir "fel" om flera spelare har fler än ett nummer men något samma)