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.
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.
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
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>"
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>"
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?
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
Ä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
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)
274 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e