webForumDet fria alternativet

Sortera beroende på annan tabell

11 svar · 380 visningar · startad av Obbelix

ObbelixMedlem sedan okt. 2002257 inlägg
#1

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
#2

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
#3
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
#4

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
#5

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
#6

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
#7

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
#8

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
#9

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
#10

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
#11

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
#12

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)

141 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)