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..
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
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
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>";