Avatar billede kjetilh Nybegynder
08. oktober 2003 - 12:02 Der er 2 kommentarer og
1 løsning

relasjoner mellom mysql rader

Heisann.

Sliter med et problem jeg ikke helt klarer å knekke...
Sliter også med å forklare det, men skal gjøre mitt beste.

Har opprettet en MySQL tabell over aksjoner.
Systemet skal være slik at en bruker kan knytte aksjoner til hverandre.
Aksjon 1 kan knyttes til Aksjon 2
Aksjon 2 kan knyttes til Aksjon 3
Aksjon 3 kan knyttes til Aksjon 4

Hvis man så ser på Aksjon 1 skal relasjonene tolkes på den måten at Aksjon 1 er knyttet til Aksjon 2,3 og 4 og motsatt Aksjon 4 er knyttet til Aksjon 1, 2 og 3 osv..

Det jeg lurer på er hvordan jeg lurest programmere noe slikt???


Har selv prøvd med med to varianter:

1. En tabell på formen:
CREATE TABLE relation (
  action_id int(5) unsigned NOT NULL default '0',
  relation_id int(5) unsigned NOT NULL default '0',
) TYPE=MyISAM;
INSERT INTO relation VALUES (1, 2);
INSERT INTO relation VALUES (2, 3);
INSERT INTO relation VALUES (3, 4);

Det jeg sliter med her er å sløyfe meg gjennom for å finne alle relasjoner knyttet til Aksjon 1 (et ukjent antall relasjoner i tabellen).

2. En tabell på formen:
CREATE TABLE relation (
  action_id int(5) unsigned NOT NULL default '0',
  relations text NOT NULL
) TYPE=MyISAM;
INSERT INTO relation VALUES (1, '2,3,4');
INSERT INTO relation VALUES (2, '1,3,4');
INSERT INTO relation VALUES (3, '1,2,4');
INSERT INTO relation VALUES (4, '1,2,3');

Hvor hver enkelt Aksjon til enhver tid har alle relaterte Aksjoner listet. Også her støter jeg på problemer når jeg skal oppdatere tabellen.. Hvis den første verdien forandres til (1, '2,3'), hvordan får jeg så oppdater resten av tabellen..

---------------------------------------------
Noen som har noen gode tips til hvordan gjøre dette best mulig?? Si også ifra hvis jeg trenger å beskrive ting nærmere..
Avatar billede jacobsdk Nybegynder
13. oktober 2003 - 22:55 #1
Hej

Her er mit bud. Jeg tror det virker, men jeg har haft lidt besvær med min udbyder, så jeg nåede ikke at blive færdig med testen.

//Tabel
mysql_query ("CREATE TABLE relation (
  action_id int(5) unsigned NOT NULL default '0',
  relation_id int(5) unsigned NOT NULL default '0'
) TYPE=MyISAM");
mysql_query("INSERT INTO relation VALUES (1, 2)");
mysql_query("INSERT INTO relation VALUES (2, 3)");
mysql_query("INSERT INTO relation VALUES (3, 4)");
print (mysql_error());
//Vi leder efter action 1, derfor sætter vi $action til 1.
$action = 1;

$relations = array($action => TRUE);
Reset ($relations);

//$count er ikke nødvendig, men sikrer os mod uendelige lykker
$count = 0;
//Vi gennemløber en løkke for hver række i $relations
while ((list($key, $val) = each($relations)) AND $count < 100) {
    $sql_query = ("SELECT * FROM relation WHERE action_id = $key");
    $result = mysql_query($sql_query);
    //For hver række der findes tjekkes det om den allere er tilføjet $relations
    //Hvis ikke, tilføjes den
    while ($row = mysql_fetch_assoc($result)) {
        $relation_id = $row['relation_id'];
        If (!$relations['$relation_id'])
            $relations['$relation_id']=True;   
    }
$count++;
}
//$relations er nu en array med felterne 1, 2, 3 og 4 sat til true, da de er relateret til 1.
Print_r ($relations);

// Brug unset hvis du vil fjerne den oprindelige action:
Unset ($relations['$action']);
//Og ellers kan du selv bestemme om du vil bruge list...each eller hvad til at behandle den videre med

Håber det hjælper. Skriv hvis du har nogen spørgsmål

Jacob
Avatar billede jacobsdk Nybegynder
13. oktober 2003 - 22:57 #2
Det smarte er selvfølgelig at den første løkke fortsætter så længe der er rækker tilbage. Og funktionen indeni tilføjer de (nye) rækker den finder, så funktionen bliver ved med at køre.

Jacob
Avatar billede kjetilh Nybegynder
15. oktober 2003 - 12:34 #3
takk for svar jacob. det var så godt som riktig, men jeg fikk ordna i de små feilene som var og har nå en kode som fungerer.

$action = 1;
$relations = array($action => TRUE);
Reset ($relations);
   
$count = 0;
while ((list($key, $val) = each($relations)) AND $count < 100)
{
  $result = mysql_query("SELECT * FROM relation WHERE action_id = $key OR relation_id = $key");
  while ($row = mysql_fetch_assoc($result))
  {
    $action_id  = $row['action_id'];
    $relation_id = $row['relation_id'];
           
    if ( $key == $action_id )
    {
      if (!$relations['$relation_id'])
        $relations[$relation_id]=True;   
    }
    else       
    {
      if (!$relations['$action_id'])
        $relations[$action_id]=True;   
    }
  }
  $count++;
}

Unset ($relations[$action]);
ksort( $relations );
foreach($relations as $k => $v)
  echo "action id $action is related to action id $k<br>";
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester