webForumDet fria alternativet

Loopa ut 1 värde flera ggr

ASP

14 svar · 478 visningar · startad av ironhead

Medlem sedan mars 20011 346 inlägg
Frågan#1

Hej!

Jag har 3 tabeller (MySQL) som är i relation med varandra.

tabell1(person):
namnId, Int
namn, varchar

tabell2 (nyckeltabell):
namnId, Int
filmId, Int

tabell3 (filmer):
filmId, Int
film, varchar

Om flera personer har samma film, så loopas det ju upp som:

Starwars Person1
Starwars Person2

Jag skulle vilja att man loopar ut filmnamnet 1 gång och personernas namn flera gånger

Starwars Person1, Person2

Hur göra på smidigaste sätt?

Medlem sedan juni 20034 013 inlägg
#2

Du mellanlagrar det i en hash. Basic har jag slutat med sedan länge så jag vet inte hur du skriver där, men så här skulle php-koden för loopen se ut så du ser principen (nån annan kanske kan hjälpa till att skriva om det)

  $film[$rs['film']][] = $rs['namn'];

Sedan för att loopa ut filmerna:

  foreach ($film as $titel => $personer)
  {
  }

Resultatet blir alltså att du får en array som ser ut så här:

$film['Starwars'] = "Person1", "Person2"

och foreach går igenom filmerna, en i taget.

Medlem sedan mars 20011 346 inlägg
#3

Vi kanske kan flytta detta till PHP-forumet istället då :)

Fråga: tydal;

Hur skriver jag sedan ut värdena i arrayen i PHP?

Medlem sedan juni 20034 013 inlägg
#4

echo($titel) i foreach-loopen för filmens namn. $personer är en array så den får du först slå ihop till en sträng med hjälp av implode:

echo(implode(", ", $personer));

Medlem sedan mars 20011 346 inlägg
#5

Jag gör fatalt fel :(
Så här ser min loop ut:

while($array = mysql_fetch_array($result))
 {
  $film[$array["title"]][] = $array["username"];
 
 foreach ($film as $titel => $personer)
  {
   echo($titel);
   echo(implode(", ", $personer));
  }
 }

då får jag ut:
FilmPerson1FilmPerson1, Person2

Medlem sedan juni 20034 013 inlägg
#6

Nej, det ser helt rätt ut. Bara att du inte har lagt in några radbrytningar, så allt hamnar ju i enda lång rad.

Om det är html kanske du vill ha det utskrivet så här:

foreach ($film as $titel => $personer)
{
  echo("<b>$titel:</b> ");
  echo(implode(", ", $personer) . "<br>");
}
Medlem sedan mars 20011 346 inlägg
#7

...men då blir ju utskriften såhär:

Film: Person1
Film: Person1, Person2

Jag vill bara ha såhär:
Film: Person1, Person2

Medlem sedan juni 20034 013 inlägg
#8

Då beror det på att det ser ut så i databasen. Om du visar den riktiga utskriften kan jag förmodligen se vad det beror på.

Medlem sedan mars 20011 346 inlägg
#9

eh? Vad vill du se?

När jag bara loopar ut med:

while($array = mysql_fetch_array($result))
{
echo $array["title"]." ".$array["username"]."<br>";
}

Får jag

Film Person1
Film Person2

och det måste ju vara ok, då jag har 2 användare i databasen och loopar ut användare kopplade till filmen.

Medlem sedan dec. 200012 464 inlägg
#10
$q = "... order by title";
...
$t = "";
$cnt = 0;
while($array = mysql_fetch_array($result))
{
  if  ($t != $array["title"] ) {
      if  ($cnt  > 0) echo "<br>";
      $t = $array["title"];
      $cnt = 0;
      echo $t;
  }
   if  ($cnt > 0) echo ",";
   echo $array["username"];
   $cnt++;
}
if  ($cnt > 0) echo "<br>";

Vill du ha en ASP-lösning också eller skall jag flytta tråden till PHP?

Medlem sedan mars 20011 346 inlägg
#11

LarsG: Supernice...funkar klocka!
Gärna ett exempel i ASP också :)

Medlem sedan dec. 200012 464 inlägg
#12
sql = "... order by title"

set rs = connect.execute(sql)

t = ""
cnt = 0
while not rs.eof 
  if  t <> rs("title" ) then
      if  cnt  > 0  then response.write "<br>"
      t = rs("title")
      cnt = 0
      response.write t
  end if
  if  cnt > 0 then  response.write ","
  response.write rs("username")
  cnt = 1
  rs.movenext
wend
if  cnt > 0 then response.write "<br>"
Medlem sedan mars 20011 346 inlägg
#13

:birp Mycket bra!

Medlem sedan mars 20011 346 inlägg
#14

Vet inte om jag ska fortsätta i denna tråd som jag redan avslutat, men problemet är relaterat till denna upplistning.

Jag vill ta ut filmer TOP 10, men får problem när jag listar ut flera personer/film, för varje användare som har samma film, kommer utskriften på skärmen att bli en film mindre, hur löser jag det?

ex. TOP 10 blir bara 5 filmer istf 10

Film1 Tore, Olle, Bengt
Film2 Tore
Film3 Tore, Olle, Bengt
Film4 Tore, Bengt
Film5 Tore

Jag kör med Count för närvarande

Medlem sedan mars 20011 346 inlägg
#15

Löste det såhär:

t = ""
cnt = 0
knt = 0

while not rs.eof or knt>10

  if  t <> rs("title") then
      if  cnt  > 0  then response.write "<br>"
      t = rs("title")
      cnt = 0
      response.write t & " "
      knt = knt + 1
  end if
  if  cnt > 0 then  response.write ","
  response.write rs("username")
  cnt = 1
  rs.movenext
  
wend

if  cnt > 0 then response.write "<br>"
268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)