/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
"Six degrees of Kevin Bacon"
Fra : Peter Brodersen


Dato : 21-08-01 02:17

Subject relaterer til en selskabsleg, hvor man skal forsøge at kæde en
vilkårlig skuespiller frem til Kevin Bacon, ud fra et antal film, to
skuespillere har været med i. Fx Arnold til Kevin:

- Arnold Schwarzenegger og Tom Arnold spillede begge med i "True Lies"
- Tom Arnold og Kevin Bacon spillede begge med i "We Married Margo"

http://oracleofbacon.org/ har endda et system til at hente
IMDb-oversigter, og have en database kørende for dette.

Det synes jeg selvfølgelig er ganske interessant, og samtidig også
ganske udfordrende - så DET må der være nogen, der har skrevet om.

Jeg har imidlertid ikke fundet så meget litteratur om de "shortest
path"-algoritmer i forbindelse med database-brug, og om der var
databasemæssige "shortcuts".

Pt. har jeg en simpel bogdatabase i MySQL med en forfatter-tabel, en
bog-tabel og en mange-til-mange-mellem-relationstabel. Jeg vil næsten
gå ud fra, at en så simpel database ikke er meget behjælpelig, men at
løsningen bliver at hive dataen ud, for derefter at hælde en del ond
programmeringskode i nakken på den - eller hvad?

I mit tilfælde er der "kun" ca. 1.000 forfattere og bøger, så det er
ikke så omfattende (og forhåbentligt ikke så ressourcekrævende) om
IMDb-tilfældet, der dog lader til at køre uden sved.

--
- Peter Brodersen

 
 
Lars Petersen (21-08-2001)
Kommentar
Fra : Lars Petersen


Dato : 21-08-01 04:22

> Subject relaterer til en selskabsleg, hvor man skal forsøge at kæde en
> vilkårlig skuespiller frem til Kevin Bacon, ud fra et antal film, to
> skuespillere har været med i. Fx Arnold til Kevin:

Ja, kender det godt det er fandme uhyggeligt :)
Der skulle efter sigende ikke findes en kendt skuespiller med et
Bacon nummer større end 4 - det rygtes at der er en der har fundet
en skuespiller i IMDb der har et Bacon nummer på 8...
Jeg prøvede ihærdigt... Men selv en grønlandsk skuespiller
der kun har medvirket i 2 film havde et Bacon nummer på 3...

> Det synes jeg selvfølgelig er ganske interessant, og samtidig også
> ganske udfordrende - så DET må der være nogen, der har skrevet om.

Hvad mener du lige præcist? Skrevet om? Algorimter eller hvordan?

Vi havde noget om det på Datalogisk Institut her i Kbh, vi skulle bl.a.
lave et program der fandt den billigste tur i HT nettet =P...

Problemet som Kevin Bacon er baseret på er Travelling Salesman Problem
(TSP):
<URL: http://google.com/search?safe=off&q=travelling+salesman+algorithm>
En af måderne at løse TSP på er Nearest Neighbor algoritmer:
<URL: http://google.com/search?safe=off&q=nearest+neighbor+algorithm>

Hmm, jeg kan ikke huske flere... Branch & Bound/Cut...

> Jeg har imidlertid ikke fundet så meget litteratur om de "shortest
> path"-algoritmer i forbindelse med database-brug, og om der var
> databasemæssige "shortcuts".

Well, der er vel altid shortcuts =) Men hvilke kan jeg ikke lige genneskue,
til det er klokken alt for mange

> Pt. har jeg en simpel bogdatabase i MySQL med en forfatter-tabel, en
> bog-tabel og en mange-til-mange-mellem-relationstabel. Jeg vil næsten
> gå ud fra, at en så simpel database ikke er meget behjælpelig, men at
> løsningen bliver at hive dataen ud, for derefter at hælde en del ond
> programmeringskode i nakken på den - eller hvad?

Jeg kan ikke lige se hvad du vil med forfattere... Men lad os blive lidt
ved Bacon problemet...
Det må vel være noget i stil med:

0. Man indtaster et navn.
1. Find alle personer denne person har spillet sammen med, men ikke
dem vi allerede har set på.
2. Tag dem en efter en... Er det Kevin Bacon?
- Ja: Hop ud!
- Nej: Gå til 1.

Denne teknik er en slags "brute force" der kaldes "width-first" -
du kan også lave det med "depth-first" sådan:

0. Man indtaster et navn.
1. Find den næste person som denne har spillet sammen med
2. Er det Kevin Bacon?
- Ja: Hop ud!
- Nej: Gå til 1

Som du kan se er det ret hukommelseskrævende...

Du skal selvfølgelig løbe alle igennem og så vælge den korteste rute.

Dette er blot een måde at håndtere det på - den mest effektive er måske
nok branch-and-cut - det er denne algoritme nogle forskere baserede sig
på da de slog rekorden og fandt den optimale rute gennem 3038 byer...
(Det krævede >50 workstations og tog næsten 14 dage...)

> I mit tilfælde er der "kun" ca. 1.000 forfattere og bøger, så det er
> ikke så omfattende (og forhåbentligt ikke så ressourcekrævende) om
> IMDb-tilfældet, der dog lader til at køre uden sved.

1000 er jo ingenting :) Ja det er rigtigt, IMDb tingen kører forbløffende
smertefrit...

Nå sovetid! Man skal jo på arbejde...


--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
http://wshlman.moons.dk/ - Say goodbye to GameSpy - A Free Half Life
Manager!
When mailing me, remember there is no truth in my mail!



Peter Brodersen (21-08-2001)
Kommentar
Fra : Peter Brodersen


Dato : 21-08-01 14:17

On Tue, 21 Aug 2001 05:22:07 +0200, "Lars Petersen"
<lars@truth.ioflux.net> wrote:

>Der skulle efter sigende ikke findes en kendt skuespiller med et
>Bacon nummer større end 4 - det rygtes at der er en der har fundet
>en skuespiller i IMDb der har et Bacon nummer på 8...

Der er nu fundet nogle med større tal. Check Hall of Fame på
http://oracleofbacon.org/ hvor det også er muligt at se cirklerne for
en vilkårlig person.

>> Det synes jeg selvfølgelig er ganske interessant, og samtidig også
>> ganske udfordrende - så DET må der være nogen, der har skrevet om.
>Hvad mener du lige præcist? Skrevet om? Algorimter eller hvordan?

Yep, skrevet om teorien, om fornuftige algoritmer, og om praktisk kode
i den retning.

>Vi havde noget om det på Datalogisk Institut her i Kbh, vi skulle bl.a.
>lave et program der fandt den billigste tur i HT nettet =P...

Klassisk problem :)

>Jeg kan ikke lige se hvad du vil med forfattere... Men lad os blive lidt
>ved Bacon problemet...

Det skulle nok uddybes lidt. I mit setup har der typisk været flere
forfattere til at skrive hver bog, ligesom der er (mange) flere
personer til hver film.

Ydermere overvejer jeg at krydse over via andre linier (fx "bog
skrevet samme år", "bog i samme genre", etc.), men jeg vil ikke
overkomplicere problemstillingen i første omgang.

>Dette er blot een måde at håndtere det på - den mest effektive er måske
>nok branch-and-cut - det er denne algoritme nogle forskere baserede sig
>på da de slog rekorden og fandt den optimale rute gennem 3038 byer...
>(Det krævede >50 workstations og tog næsten 14 dage...)

Check. Jeg vil gå igang med at søge videre efter passende litteratur.
Oraklet anbefalede "Introduction to Algorithms", men da jeg for det
første ikke er en hård matematiker, og for det andet næppe kommer til
at rode meget med større problemstillinger i fremtiden, ville jeg lige
høre om hvorvidt, det stadigvæk ville være et godt køb, eller om der
var noget mere passende litteratur.

--
- Peter Brodersen

Lars Petersen (22-08-2001)
Kommentar
Fra : Lars Petersen


Dato : 22-08-01 00:53

> Check. Jeg vil gå igang med at søge videre efter passende litteratur.
> Oraklet anbefalede "Introduction to Algorithms", men da jeg for det
> første ikke er en hård matematiker, og for det andet næppe kommer til
> at rode meget med større problemstillinger i fremtiden, ville jeg lige
> høre om hvorvidt, det stadigvæk ville være et godt køb, eller om der
> var noget mere passende litteratur.

Hmm jeg troede jeg havde den, men efter et hurtigt check ser det
dog ikke sådan ud... Jeg er dog sikker på at jeg har læst [i] den :)

http://www.amazon.co.uk/exec/obidos/ASIN/0262530910/
^ Der er den

Hvis du har interesse i programmering, så synes jeg bestemt du skal
købe den og læse den!

--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
http://wshlman.moons.dk/ - Say goodbye to GameSpy - A Free Half Life
Manager!
When mailing me, remember there is no truth in my mail!



Peter Brodersen (22-08-2001)
Kommentar
Fra : Peter Brodersen


Dato : 22-08-01 01:17

On Wed, 22 Aug 2001 01:53:16 +0200, "Lars Petersen"
<lars@truth.ioflux.net> wrote:

>Hmm jeg troede jeg havde den, men efter et hurtigt check ser det
>dog ikke sådan ud... Jeg er dog sikker på at jeg har læst [i] den :)
>
>http://www.amazon.co.uk/exec/obidos/ASIN/0262530910/
>^ Der er den

Jeg kunne være fristet.

Imidlertid har jeg fået banket noget kode sammen, der:
1. overraskende nok virkede
2. ikke fyldte så meget
3. kan klare et vilkårligt antal "degrees".

Det er ikke særligt optimeret, og der foretages en god del
forespørgsler undervejs, men det virker på få sekunder. Ikke at mit
datagrundlag var så stort, dog (plus at hver forfatter typisk kun har
0-3 medforfattere). I øjeblikket finder det bare en tråd, ud fra én
person.

I grove træk er koden et samspil af PHP og MySQL, og i korte træk
bruges bruges tre tabeller:

sce: (bogtabel)
id
title

aut: (forfattertabel)
id
name

asrel: (mangetilmange-relationstabel)
id
aut_id (fremmednøgle til aut.id)
sce_id (fremmednøgle til sce.id)


Derefter er koden simpel:

==
Grundperson x tilføjes til "check"-listen.
[1] "check"-listen køres igennem:
Folk i checklisten tilføjes "notlink"-listen - altså dem, vi
allerede har fundet.

Vi kører en query for at finde flere folk, vi ikke allerede har
fundet. $link er den aktuelle person, og $notlink er en
kommasepareret liste over dem, vi allerede har fundet:

SELECT t2.aut_id AS link, sce.title
FROM asrel AS t1, sce, asrel AS t2
WHERE t1.aut_id = '$link'
AND sce.id = t1.sce_id
AND t1.sce_id = t2.sce_id
AND t2.aut_id NOT IN ($notlist)
GROUP BY link;

Enhver person herfra tilføjes "næste niveaus checkliste".

Hvis der er folk i "næste niveaus checkliste", så gentag [1].
==

Det kan ret sikkert gøres noget pænere. Jeg ved ikke om der er en mere
optimal måde at lade en tabel join'e med sig selv på. Det er næsten
det eneste sted, det lige slår mig at der kan optimeres, når jeg, som
herover, finder "alle" i samme tråd.

--
- Peter Brodersen

Peter Brodersen (22-08-2001)
Kommentar
Fra : Peter Brodersen


Dato : 22-08-01 16:47

On Wed, 22 Aug 2001 02:16:49 +0200, Peter Brodersen
<professionel@nerd.dk> wrote:

> SELECT t2.aut_id AS link, sce.title
> FROM asrel AS t1, sce, asrel AS t2
> WHERE t1.aut_id = '$link'
> AND sce.id = t1.sce_id
> AND t1.sce_id = t2.sce_id
> AND t2.aut_id NOT IN ($notlist)
> GROUP BY link;

.... og denne kunne selvfølgelig optimeres ved i stedet at lave en
forespørgsel for hver person, så tilsvarende bruge en IN her - fx:

SELECT t2.aut_id AS link, sce.title
FROM asrel AS t1, sce, asrel AS t2
WHERE t1.aut_id IN ($linklist)
AND sce.id = t1.sce_id
AND t1.sce_id = t2.sce_id
AND t2.aut_id NOT IN ($notlist)
GROUP BY link;

Nu er jeg nede på én query pr. niveau/"degree", i stedet for én query
pr. person fundet. Det øgede hastigheden betydeligt.
--
- Peter Brodersen

Christian Schmidt (29-08-2001)
Kommentar
Fra : Christian Schmidt


Dato : 29-08-01 21:54

Lars Petersen wrote:
>
> > Subject relaterer til en selskabsleg, hvor man skal forsøge at kæde en
> > vilkårlig skuespiller frem til Kevin Bacon, ud fra et antal film, to
> > skuespillere har været med i. Fx Arnold til Kevin:
>
> Problemet som Kevin Bacon er baseret på er Travelling Salesman Problem
> (TSP):

Kevin Bacon-problemet er da vel ikke TSP, hva'? TSP handler om at finde
den korteste sluttede vej gennem et antal punkter i en given mængde.

Mon ikke snarere vi skal have fat i en korteste vej-algoritme, som Peter
selv foreslår?

Et eksempel herpå er Dijkstras algoritme (beskrevet i kapitel 25 i
omtalte "Introduction to algorithms"). Her udstyres hver kendt
skuespiller s med en parameter d[s], der repræsenterer vedkommendes
afstand til Kevin Bacon. Denne værdi sættes initielt til uendeligt for
alle skuespillere undtagen Bacon.

<gentag indtil alle skuespillere har været valgt>
Vælg den skuespiller s, hvor d[s] er mindst, og som ikke tidligere
har været valgt (dvs. hver skuespiller kan kun vælges én gang).
For hver skuespiller x, som s har spillet sammen med, undersøges
om d[x] > d[s] + 1. I givet fald sættes værdien af d[x] til
d[s] + 1.
</gentag>

Når algoritmen er færdig, vil d[s] indeholde afstanden fra s til Kevin
Bacon.

Hvis alt dette foregår i RAM (modsat på disk, i database osv.) vil en
simpel implementation have en køretid på O(V²), mens man ved brug af
særlige datastrukturer (en Fibonacci-hob) kan opnå en køretid på O(V log
V + E), hvor V er antal skuespillere (knuder i grafen) og E er antal
forbindelser mellem to skuespillere, dvs. antallet af unikke par af
skuespillere, der har optrådt i samme film (kanterne i grafen).


Hvis man nu vil lave algoritmen i en ren database-version, hvor man
antager, at antallet af skuespillere er så stort, at man ikke kun kan
repræsentere ganske få i RAM ad gangen (i det konkrete eksempel en
urimelig streng antagelse, men lad os sige, at vi ville overføre
problemet fra skuespillere til alle mennesker på hele jorden a la det
hedengangne sixdegrees.com) - hvad så?

Tja, jeg har en idé. Idéen bygger på antagelsen om, at når man har valgt
en skuespiller s med en given afstand d[s], da vil alle nye tildelinger
af værdier til d[x] være mindst d[s] + 1. Dvs. at udvælgelsen af den
skuespiller med mindst d[s] vil kunne gøres i store blokke ad gangen i
stedet for én ad gangen.

Hvad med noget i retning af dette fuldstændig utestede pseudo-kode:

query("UPDATE skuespillere SET afstand = UENDELIG")
for ($afstand = 0; ; $afstand++) {
$rs = query("SELECT id_2
   FROM skuespillere AS s1
   LEFT JOIN par ON par.id_1 = s1.id
   LEFT JOIN skuespillere AS s2 ON par.id_2 = s2.id
   WHERE par = 1 AND
    s1.afstand = $afstand AND
    s2.afstand > $afstand + 1");

//hvis $rs er tom, så hop ud af løkken
   
while ($row = $rs->fetchRow()) {
$rs = query("UPDATE skuespillere
      SET afstand = $afstand + 1
      WHERE id = $row[id_2]");
}
}

Tabellen par (id_1, id_2) indeholder par af skuespillere, der har
optrådt sammen. Dvs. hvis skuespillerne med id hhv. 9 og 11 har optrådt
sammen, da indeholder tabellen både (9, 11) og (11, 9).

Jeg kender ikke alverden til nested SELECTs, men det foresvæver mig, at
man vil kunne kombinere UPDATE og SELECT i ét udtryk. Dette vil nok ikke
ændre alverden på den teoretiske beregningskompleksitet, men køretiden
vil nok mindskes betragteligt pga. det stærkt reducerede antal kald til
databasen.

Jeg antager, at der er indeks på alle nævnte felter, og at et opslag i
et index kan foretages i O(log n), samt at opslag i et index for en
værdi kan gøres i O(log n) uanset hvor mange gange værdien optræder (en
range query).

Da vil SELECTen tage O(log V) (find alle skuespillere med afstand =
$afstand) + O(log E) (for hver af disse, find hvilke skuespillere de
optræder sammen med) x O(log V) (for hvert af disse, find deres afstand)
= O(log V + log V x log E) = O(log² V). Dette skal så gentages et antal
gange, indtil alle skuespillere har været valgt, hvilket i værste fald
kan være V (men vil i praksis være langt mindre - et mere præcist
estimat, anyone?).

Nederste UPDATE foretages max. E gange (iflg. Introduction to
Algoritms). Hver gang kan skal skuespilleren slås op ud fra dens id
(gøres i O(log V)), og afstanden skal ændres, dvs. afstands-indexet skal
opdateres, hvilket kan gøres i ... O(log V)? UPDATEn bidrager således
til O(E x (log V + log V)) = O(E log V).

Hvis alt ovenstående holder stik (fat chance), bliver den samlede
køretid så O(log² V) + O(E log V) = O(E log V) - hvilket er ganske tæt
på køretiden i RAM - så bliver det nok ikke meget bedre (imponerende nok
kan en hel del problemer løses med samme kompleksitet i sekundært lager
(diske, bånd mv.) som i RAM).


DISCLAIMER:
Ovenstående er sikkert fyldt med fejl. Jeg er ingen haj udi sligt.
Derudover er jeg netop hjemvendt fra USA og har pga. rejse og
tidsforskel ikke sovet alverden det sidste 1½ døgn, så jeg er lidt træt
i mit hoved Men lad mig høre, hvad de kloge hoveder her i gruppen
har kommentarer hertil.


Christian

Peter Brodersen (31-08-2001)
Kommentar
Fra : Peter Brodersen


Dato : 31-08-01 02:49

On Wed, 29 Aug 2001 22:54:06 +0200, Christian Schmidt
<christian@schmidt.net> wrote:

>Jeg kender ikke alverden til nested SELECTs, men det foresvæver mig, at
>man vil kunne kombinere UPDATE og SELECT i ét udtryk. Dette vil nok ikke
>ændre alverden på den teoretiske beregningskompleksitet, men køretiden
>vil nok mindskes betragteligt pga. det stærkt reducerede antal kald til
>databasen.

.... med fare for netop at lyde praktisk og uteoretisk i forhold til
resten af dit indlæg, så forekommer det mig at der (selvfølgelig ikke
overraskende) er meget ved at vinde med simple tricks og
"så-gør-vi-også-lige-det-i-samme-omgang"-stunts.

Mit nuværende setup er altså fortløbende at hive
resultater/person-id's ud - der foretages en query pr. trin, og hver
query er altså identisk, bortset fra at der er hældt flere folk til.

Vi skal finde ud af hvem person-id 245 er forbundet til:

SELECT [.. diverse data ..]
FROM asrel AS t1, asrel AS t2, sce
WHERE t1.aut_id IN (245)
[.. alle relationer frem og tilbage ..]
AND t2.aut_id NOT IN (245)
GROUP BY fundetperson

Ud fra denne query får vi så fx id 60 og 221, som altså er forbundet.
Query'en i næste trin vil så være:

SELECT [.. diverse data ..]
FROM asrel AS t1, asrel AS t2, sce
WHERE t1.aut_id IN (60,221)
[.. alle relationer frem og tilbage ..]
AND t2.aut_id NOT IN (245,60,221)
GROUP BY fundetperson

Herfra finder vi måske kun én person, nr. 59, og vores næste query vil
så være:

SELECT [.. diverse data ..]
FROM asrel AS t1, asrel AS t2, sce
WHERE t1.aut_id IN (59)
[.. alle relationer frem og tilbage ..]
AND t2.aut_id NOT IN (245,60,221,59)
GROUP BY fundetperson

.... og så fremdeles. Altså meget, meget enkelt at hælde ind i en
simpel løkke i sit FavoritSprog. Førstnævnte relation vil pege på "dem
netop fundet sidst", og sidstnævnte vil indeholde en tiltagende
udelukkelses-liste.

Min erfaring hermed er, at "lange tråde" (altså med mange rækker) ikke
er specielt slemme, men findes der mange personer i starten (også
selvom de mange nye personer ikke har flere at være koblet sammen
med), vil det være lidt tungt her. Det er klart, at den tiltagende
"NOT IN"-liste vil sætte krav til database-systemets opbygning. Her
forekommer det mig, at MySQL let piver over det stigende antal rows,
der skal "tages højde for", alene pga. den efterhånden lange "NOT
IN"-liste. I mit tilfælde er det ikke det større problem, da en person
kun typisk er forbundet til 0-3 andre, men i et film-tilfælde, vil en
sådan liste hurtigt eksplodere.

Eneste, jeg pt. ikke er så begejstret for (udover at mit datamateriale
ikke har så mange forfattere, der har links til hinanden) er, at man
vel egentligt godt kan betragte det som en lille smule redundans, at
der hele tiden bruges den samme NOT-liste, bare "lidt større" ved hver
query. Jeg kunne måske overveje noget med at arbejde med en temp-kopi
af databasen, og så fjerne entries på den hårde måde i stedet for.
Problemet, som jeg ser det nu, er, at hvis der i første omgang kommer
for mange med på den NOT-liste alt for tidligt, så skal databasen
trækkes med at der gang på gang vil være alt det at "tage højde
for"...

En simpel opgradering fra MySQL 3.22 til 3.23 (og fra ISAM til
MyISAM), hjalp i øvrigt gevaldigt på føromtalte sløvhed, og jeg har
klart på fornemmelsen, at det kan optimeres en del mere vha. simple
ting (evt. forsøge at lave noget read-only-adgang, m.m.). Jeg har dog
ikke løbende benchmarket så meget, som jeg burde, men i mit tilfælde
er tiderne i praksis klart til at leve med. For sjov lavede jeg endnu
en løkke uden om det almindelige setup, så i stedet for bare at finde
en persons "tråd", forsøgte jeg at finde længden på hver enkelt
persons tråd - dvs. knap 300 personer, hvilket gav i alt 575 queries
(hvor en normal person svinger mellem 0 og 6 led/queries). På mit
simple hjemmecomputer-system tager dette en 6-7 sekunder, hvilket,
igen i mit tilfælde, absolut er tilfredsstillende for at lave en
gennemgang, knap 300 gange.

Mit nuværende "problem" er dog næsten lidt pinligt, men jeg er i tvivl
om hvordan, jeg kan gøre det på den mest optimale måde, når jeg i en
query endelig finder den, der skal matches med (i tilfælde af at man
vælger to personer, og bare starter fra den ene). Altså, i og med at
jeg jo har en query i en løkke, så kan jeg godt risikere at jeg
befinder mig i "tredje gennemkørsel/cirkel/query", uden al information
fra før. Så når jeg endelig finder ud af at "29" har "100" (som måske
var ham, vi skulle finde) i sin inderkreds, hvordan finder jeg så ud
af, hvordan jeg i første omgang fandt frem til 29? For mig lugter det
umiddelbart af at man gemmer hver evige eneste row i alle sine
resultater...

>Derudover er jeg netop hjemvendt fra USA og har pga. rejse og
>tidsforskel ikke sovet alverden det sidste 1½ døgn, så jeg er lidt træt
>i mit hoved

Øv, jeg kan kun stille med netop at være hjemvendt fra London og knap
så mange timers "oppetid"

--
- Peter Brodersen

Nis Jorgensen (04-09-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 04-09-01 17:57

On Fri, 31 Aug 2001 03:48:45 +0200, Peter Brodersen
<professionel@nerd.dk> wrote:

>On Wed, 29 Aug 2001 22:54:06 +0200, Christian Schmidt
><christian@schmidt.net> wrote:
>
>>Jeg kender ikke alverden til nested SELECTs, men det foresvæver mig, at
>>man vil kunne kombinere UPDATE og SELECT i ét udtryk. Dette vil nok ikke
>>ændre alverden på den teoretiske beregningskompleksitet, men køretiden
>>vil nok mindskes betragteligt pga. det stærkt reducerede antal kald til
>>databasen.
>
>... med fare for netop at lyde praktisk og uteoretisk i forhold til
>resten af dit indlæg, så forekommer det mig at der (selvfølgelig ikke
>overraskende) er meget ved at vinde med simple tricks og
>"så-gør-vi-også-lige-det-i-samme-omgang"-stunts.

Det er hverken et stunt eller et trick. Det er forskellen paa at lave
hovedparten af arbejdet i SQL eller i et host language.

Christians løsning er i praxis identisk med nedenstående, som giver
dig Bacon-nummeret på alle personer i databasen ved at kalde
_den_samme_ SQL-sætning igen og igen.


//Jeg foretraekker NULL frem for 'uendelig':

UPDATE skuespillere
SET afstand = Null;

//Glem ikke Kevin Bacon:

UPDATE skuespillere
SET afstand = 0
WHERE Navn = 'Kevin Bacon';

DO

UPDATE skuepillere AS s1 INNER JOIN Pairs ON s1.id = Pairs.id_1 INNER
JOIN skuespillere AS s2 ON s2.id = Pairs.id_2
SET s1.afstand = s2.afstand + 1
WHERE s1.afstand IS NULL AND s2.afstand =
(SELECT Max(afstand) FROM skuespillere)

UNTIL recordsaffected = 0



Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste