/ 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
Join i query ... funger bare ik'!
Fra : Peter Farsinsen


Dato : 22-03-03 13:32

Nedenstående er også postet i dk.edb.internet.webdesign.serverside.php for
et par timer siden, men fik at vide at jeg skulle prøve her...

******************

Så langt så godt...

Jeg har nu prøvet nærmest alt, synes jeg, og lige lidt har det hjulpet - jeg
kan simpelthen ikke få min query til at virke...

pt. ser den ud som flg.:

$sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
tekst FROM spmskema LEFT JOIN spmskema_besvaret_af ON
spmskema.skema_id=spmskema_besvaret_af.skema_id_ref WHERE
spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] AND
spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref";

og jeg har også prøvet flg.:

$sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
tekst FROM spmskema, spmskema_besvaret_af WHERE
spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] AND
spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref";

Jeg får ingen fejl af nogen slags, men jeg får såmænd heller ikke noget
output...

Hvad jeg skal er altså at trække data ud fra "spmskema", hvor der ikke er en
post i "spmskema_besvaret_af" hvor feltet "skema_id_ref" indeholder id'et
for tabellen "spmskema" aka. "skema_id" OG der i feltet "brugerid" i
"spmskema_besvaret_af" ikke er står indholdet af
"$_SESSION[medlemmer_brugerid]" ... der er altså tale om en slags kombineret
nøgle!

Hvis f.eks. "torben" med "brugerid" = 10 har udfyldt "spmskema" = 20 bliver
flg. post oprettet i "smpskema_besvaret_af"

id --- skema_id_ref --- brugerid
1 20 10

Ergo når "torben" er logget ind og den ønskede/ovenstående query bliver
kørt, skal torden ikke kunne se data fra "spmskema" hvor "skema_id" er = 20,
logger "jens" med "brugerid" = 12 ind skal han selvfølgelig få resultat ud
på query, indtil han har udfyldt og der også for ham bliver oprettet en post
i "spmskema_besvaret_af" altså:

id --- skema_id_ref --- brugerid
1 20 12

Håber at nogen kan hjælpe, jeg kan ikke overskue det mere i hvert fald...

mvh

Peter Farsinsen




 
 
Kristian Damm Jensen (22-03-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 22-03-03 22:04

Peter Farsinsen wrote:
>
> Nedenstående er også postet i dk.edb.internet.webdesign.serverside.php for
> et par timer siden, men fik at vide at jeg skulle prøve her...
>
> ******************
>
> Så langt så godt...
>
> Jeg har nu prøvet nærmest alt, synes jeg, og lige lidt har det hjulpet - jeg
> kan simpelthen ikke få min query til at virke...
>
> pt. ser den ud som flg.:
>
> $sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
> tekst FROM spmskema LEFT JOIN spmskema_besvaret_af ON
> spmskema.skema_id=spmskema_besvaret_af.skema_id_ref WHERE
> spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] AND
> spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref";

Hvis det skal give mening at lave en outer join, skal betingelsen
spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] ikke stå
i where-delen, men i join-delen.

Og der er ingen pointe i at angive både

spmskema.skema_id = spmskema_besvaret_af.skema_id_ref
og spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref

Det vil i al fald sikre et tomt outputsæt.

> og jeg har også prøvet flg.:
>
> $sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
> tekst FROM spmskema, spmskema_besvaret_af WHERE
> spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] AND
> spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref";
>
> Jeg får ingen fejl af nogen slags, men jeg får såmænd heller ikke noget
> output...

At du ikke får output her kan undre. Hvis du har bare nogenlunde
rerpæsentative data i din base, burde de vælte ud. Men næppe dem du er
interesseret i.

> Hvad jeg skal er altså at trække data ud fra "spmskema", hvor der ikke er en
> post i "spmskema_besvaret_af" hvor feltet "skema_id_ref" indeholder id'et
> for tabellen "spmskema" aka. "skema_id" OG der i feltet "brugerid" i
> "spmskema_besvaret_af" ikke er står indholdet af
> "$_SESSION[medlemmer_brugerid]" ... der er altså tale om en slags kombineret
> nøgle!

Jeg er ikke 100% sikker på at jeg forstår beskrivelsen, men som den står
her, virker det mere logisk at bruge en not exists frasortere de rækker
du ikke vil se.

SELECT spmskema.skema_id
, (spmskema.$_SESSION[medlemmer_sprog]) AS tekst
FROM spmskema
WHERE NOT EXISTS
(SELECT * FROM spmskema_besvaret_af
WHERE spmskema.skema_id=spmskema_besvaret_af.skema_id_ref
AND spmskema_besvaret_af.brugerid =
$_SESSION[medlemmer_brugerid] )

Så vil jeg bare håbe, at du ikke bruger MySQL, thi den understøtter ikke
sub-selects. I så fald må du ud i esoteriske omskrivninger. Det kan
godt lade sig gøre at udføre det samme ved hjælp af en outer join, men
det er ikke helt let gennemskueligt.

<snip>

Det er i øvrigt en god idé altid at sætte koden struktureret op. Ellers
så inviterer man til at miste overblikket.

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Peter Farsinsen (23-03-2003)
Kommentar
Fra : Peter Farsinsen


Dato : 23-03-03 00:28

"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev..."

> Hvis det skal give mening at lave en outer join, skal betingelsen
> spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] ikke stå
> i where-delen, men i join-delen.
>
> Og der er ingen pointe i at angive både
>
> spmskema.skema_id = spmskema_besvaret_af.skema_id_ref
> og spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref

Som du nok har regnet ud er det første gang jeg sån' har forsøgt at sætte
mig ind i joins, og ja jeg vidste faktisk ikke at man kunne bruge AND i join
sektionen ... Derfor kom jeg frem til nedenstående, som ikke fungere, og dog
alligevel bedre end før ...

$sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
tekst
FROM spmskema LEFT JOIN spmskema_besvaret_af
ON spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref
AND spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid]";

(Er det sån' jeg skal stille koden op ?)

Ovenstående giver altså output, men selvfølgelig ikke det rigtige ... hvis
en post i spmskema har id 20, og der i spmskema_besvaret_af er flere poster
hvor skema_id_ref indholder 20 returnere query recorden fra spmskema flere
gange, hvordan jeg skal WHERE mig ud af den kan jeg ikke lige se...

> Jeg er ikke 100% sikker på at jeg forstår beskrivelsen, men som den står
> her, virker det mere logisk at bruge en not exists frasortere de rækker
> du ikke vil se.
>
> SELECT spmskema.skema_id
> , (spmskema.$_SESSION[medlemmer_sprog]) AS tekst
> FROM spmskema
> WHERE NOT EXISTS
> (SELECT * FROM spmskema_besvaret_af
> WHERE spmskema.skema_id=spmskema_besvaret_af.skema_id_ref
> AND spmskema_besvaret_af.brugerid =
> $_SESSION[medlemmer_brugerid] )

Ud fra ovenstående at dømme har du forstået beskrivelsen 100% ... det er
NETOP hvad jeg skal have returneret!

> Så vil jeg bare håbe, at du ikke bruger MySQL, thi den understøtter ikke
> sub-selects. I så fald må du ud i esoteriske omskrivninger. Det kan
> godt lade sig gøre at udføre det samme ved hjælp af en outer join, men
> det er ikke helt let gennemskueligt.

Selvfølgelig bruger jeg MySQL ... og ja jeg hørte om subselects i går, men
desværre er det først med i MySQL fra version 4.1 og den er så vidt jeg ved
ikke ude i stable endnu, så jeg tvivler på at min host vil installere det :/

mvh

Peter Farsinsen



Kristian Damm Jensen (23-03-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 23-03-03 12:45

Peter Farsinsen wrote:
>
> "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev..."
>
> > Hvis det skal give mening at lave en outer join, skal betingelsen
> > spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid] ikke stå
> > i where-delen, men i join-delen.
> >
> > Og der er ingen pointe i at angive både
> >
> > spmskema.skema_id = spmskema_besvaret_af.skema_id_ref
> > og spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref
>
> Som du nok har regnet ud er det første gang jeg sån' har forsøgt at sætte
> mig ind i joins, og ja jeg vidste faktisk ikke at man kunne bruge AND i join
> sektionen ... Derfor kom jeg frem til nedenstående, som ikke fungere, og dog
> alligevel bedre end før ...
>
> $sql = "SELECT spmskema.skema_id, (spmskema.$_SESSION[medlemmer_sprog]) AS
> tekst
> FROM spmskema LEFT JOIN spmskema_besvaret_af
> ON spmskema.skema_id <> spmskema_besvaret_af.skema_id_ref
> AND spmskema_besvaret_af.brugerid <> $_SESSION[medlemmer_brugerid]";
>
> (Er det sån' jeg skal stille koden op ?)

"Skal" er et stort ord. Men det er bestemt et fremskridt for
læseligheden.

Jeg vil bare tilføje at hele historien med $sql= og "" er irrelevant i
SQL-sammenhæng. De har kun med værtssproget (i dit tilfælde php, så vidt
jeg husker) at gøre.

> Ovenstående giver altså output, men selvfølgelig ikke det rigtige ... hvis
> en post i spmskema har id 20, og der i spmskema_besvaret_af er flere poster
> hvor skema_id_ref indholder 20 returnere query recorden fra spmskema flere
> gange, hvordan jeg skal WHERE mig ud af den kan jeg ikke lige se...

Nej. Du kan ikke lave en where, der redder dig ud af, at grundtanken er
forkert.

Her kunne jeg skrive en mindre roman, om *hvorfor* det du gør er
forkert, men det vil jeg afholde mig fra.

> > Jeg er ikke 100% sikker på at jeg forstår beskrivelsen, men som den står
> > her, virker det mere logisk at bruge en not exists frasortere de rækker
> > du ikke vil se.
> >
> > SELECT spmskema.skema_id
> > , (spmskema.$_SESSION[medlemmer_sprog]) AS tekst
> > FROM spmskema
> > WHERE NOT EXISTS
> > (SELECT * FROM spmskema_besvaret_af
> > WHERE spmskema.skema_id=spmskema_besvaret_af.skema_id_ref
> > AND spmskema_besvaret_af.brugerid =
> > $_SESSION[medlemmer_brugerid] )
>
> Ud fra ovenstående at dømme har du forstået beskrivelsen 100% ... det er
> NETOP hvad jeg skal have returneret!
>
> > Så vil jeg bare håbe, at du ikke bruger MySQL, thi den understøtter ikke
> > sub-selects. I så fald må du ud i esoteriske omskrivninger. Det kan
> > godt lade sig gøre at udføre det samme ved hjælp af en outer join, men
> > det er ikke helt let gennemskueligt.
>
> Selvfølgelig bruger jeg MySQL ... og ja jeg hørte om subselects i går, men
> desværre er det først med i MySQL fra version 4.1 og den er så vidt jeg ved
> ikke ude i stable endnu, så jeg tvivler på at min host vil installere det :/

Nuvel, vi lader nåde gå for ret. (Jeg har da også selv en MySQL
installeret til at lege med.)

Her er en version, der ikke kræver subselects. Til gengæld må du så gøre
mig (og dig selv) den tjeneste at købe et IDG-hæfte eller lignende, der
giver en introduktion til SQL.

SELECT spmskema.skema_id
, (spmskema.$_SESSION[medlemmer_sprog]) AS tekst
FROM spmskema
LEFT OUTER JOIN spmskema_besvaret_af
ON spmskema.skema_id=spmskema_besvaret_af.skema_id_ref
AND spmskema_besvaret_af.brugerid = $_SESSION[medlemmer_brugerid]
WHERE spmskema_besvaret_af.skema_id_ref is NULL

Dette burde have samme funktionalitet som mit første forslag. Men i
modsætning til mit første forslag, som jeg er rimelig sikker på, så vil
jeg ikke stole på det her, før det er testet...

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Peter Farsinsen (23-03-2003)
Kommentar
Fra : Peter Farsinsen


Dato : 23-03-03 15:28

"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev..."

> "Skal" er et stort ord. Men det er bestemt et fremskridt for
> læseligheden.

Nu er hjælp jo ofte betinget af at man gør sig nogenlunde forståelig, og
hvis en sådan query opstilling er det der "skal" til må man jo indordne sig
:)

> Jeg vil bare tilføje at hele historien med $sql= og "" er irrelevant i
> SQL-sammenhæng. De har kun med værtssproget (i dit tilfælde php, så vidt
> jeg husker) at gøre.

Joeh, du har ret skal prøve at skippe det, hvis en tråd skulle blive aktuel
en anden gang!

> Nej. Du kan ikke lave en where, der redder dig ud af, at grundtanken er
> forkert.
>
> Her kunne jeg skrive en mindre roman, om *hvorfor* det du gør er
> forkert, men det vil jeg afholde mig fra.

Jeg kan godt selv se at min query var forkert, jeg forstod - og det gør jeg
såmænd stadig ikke - bare ikke at skrive den om, dog har din hjælp givet
stof til eftertanke samt et klart praj om hvad jeg bør læse lidt mere
indgående om!

> Nuvel, vi lader nåde gå for ret. (Jeg har da også selv en MySQL
> installeret til at lege med.)
>
> Her er en version, der ikke kræver subselects. Til gengæld må du så gøre
> mig (og dig selv) den tjeneste at købe et IDG-hæfte eller lignende, der
> giver en introduktion til SQL.

Jeg HAR forlængst købt et sql hæfte fra idg, dog er afsnittene om joins
meget korte og ikke så dybe ... og manualen på mysql.com er måske lige i den
svære ende når man skal lære...

> SELECT spmskema.skema_id
> , (spmskema.$_SESSION[medlemmer_sprog]) AS tekst
> FROM spmskema
> LEFT OUTER JOIN spmskema_besvaret_af
> ON spmskema.skema_id=spmskema_besvaret_af.skema_id_ref
> AND spmskema_besvaret_af.brugerid = $_SESSION[medlemmer_brugerid]
> WHERE spmskema_besvaret_af.skema_id_ref is NULL
>
> Dette burde have samme funktionalitet som mit første forslag. Men i
> modsætning til mit første forslag, som jeg er rimelig sikker på, så vil
> jeg ikke stole på det her, før det er testet...

Det er testet, på alle mulige måder ... og det virker, super super super ...

Tak for hjælpen!

mvh

Peter Farsinsen



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

Månedens bedste
Årets bedste
Sidste års bedste