/ 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
LEFT JOIN
Fra : Jimmy


Dato : 09-12-02 23:43

Hej

Jeg har et site hvor jeg har en tabel med en række profiler.
Jeg har en anden tabel, hvor deres evt. billede ligger i (URL'en).
Billedet kan være aktivt eller passivt og indeholder derfor også de gamle,
slettede billeder.

Nu ønsker jeg at udtrække alle profiler fra tabellen "brugere" og hente
deres billede, hvis der er et.
Dette billede skal i så fald være aktivt.

Jeg har forsøgt at LEFT JOINe men så kommer der for en bruger en post for
hvert billede han nogensinde har haft.

Hvordan kan jeg udtrække alle brugere, og deres eventuelle billede som skal
have Status = Active ?

Jeg har prøvet RIGHT JOIN men der var intet bid :-/

Håber det giver mening...


Mvh
Jimmy



 
 
Niels Andersen (10-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 10-12-02 09:56

Jimmy wrote in <q19J9.3793$AN5.5643@news.get2net.dk>:
> Hvordan kan jeg udtrække alle brugere, og deres eventuelle billede som
> skal have Status = Active ?

WHERE status!='inactive'

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Jimmy (10-12-2002)
Kommentar
Fra : Jimmy


Dato : 10-12-02 10:33


"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:0_hJ9.63169$HU.4670054@news010.worldonline.dk...
> Jimmy wrote in <q19J9.3793$AN5.5643@news.get2net.dk>:
> > Hvordan kan jeg udtrække alle brugere, og deres eventuelle billede som
> > skal have Status = Active ?
>
> WHERE status!='inactive'

Så nemt er det ikke.
Der er jo ikke sikkert et billede.
Men _hvis_ det er der skal det have status Active.

Det er jo her hele problemet er.

At nogen gange er der et billede, andre gange ikke.
Hvis der er kan det have adskillige status mens kun staus Active er
interessant.

Mvh
Jimmy



Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 10:41

On Mon, 9 Dec 2002 23:43:05 +0100, "Jimmy" <spoerg@efter.den> wrote:

>
>Jeg har et site hvor jeg har en tabel med en række profiler.
>Jeg har en anden tabel, hvor deres evt. billede ligger i (URL'en).
>Billedet kan være aktivt eller passivt og indeholder derfor også de gamle,
>slettede billeder.
>
>Nu ønsker jeg at udtrække alle profiler fra tabellen "brugere" og hente
>deres billede, hvis der er et.
>Dette billede skal i så fald være aktivt.
>
>Jeg har forsøgt at LEFT JOINe men så kommer der for en bruger en post for
>hvert billede han nogensinde har haft.
>
>Hvordan kan jeg udtrække alle brugere, og deres eventuelle billede som skal
>have Status = Active ?

Det ville hjælpe lidt hvis du gav os nogle tabeldefinitioner, samt
angav hvilken db du bruger. Her er et forsøg - ret det selv til.

SELECT profiler.*, billeder.URL
FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
billeder.profil_id AND billeder.Status = 'Active')

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jimmy (10-12-2002)
Kommentar
Fra : Jimmy


Dato : 10-12-02 11:43


"Nis Jorgensen" <nis@dkik.dk> wrote in message
news:pddbvu4peuhn3vel1aekb0vjbns0q2dl4m@4ax.com...
> On Mon, 9 Dec 2002 23:43:05 +0100, "Jimmy" <spoerg@efter.den> wrote:
>
> >

> Det ville hjælpe lidt hvis du gav os nogle tabeldefinitioner, samt
> angav hvilken db du bruger. Her er et forsøg - ret det selv til.

Det har du ret i.
De kan ses nedenfor.

> SELECT profiler.*, billeder.URL
> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
> billeder.profil_id AND billeder.Status = 'Active')

Det ser umiddelbart fornuftigt ud, men er der ikke noget med, at ON ikke må
bruges som en WHERE?

Jeg kunne ikke lige få det til at fungere, men det er muligvis en fejl i min
kode.
Checker op på det senere.

Her er tabellerne:

CREATE TABLE line_brugere_images (
ID int(10) unsigned NOT NULL auto_increment,
Ref_Profil_ID int(11) default NULL,
Status enum('Passive','Awaits Approval','Active','Removed By
Admin','Removed By User','Un-Approved') NOT NULL default 'Awaits Approval',
Image_Name varchar(50) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;


CREATE TABLE line_brugere (
ID int(10) unsigned NOT NULL auto_increment,
Login varchar(25) default NULL,
PRIMARY KEY (ID)
) TYPE=MyISAM;


Mvh
Jimmy



Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 11:58

On Tue, 10 Dec 2002 11:43:09 +0100, "Jimmy" <spoerg@efter.den> wrote:

>
>"Nis Jorgensen" <nis@dkik.dk> wrote in message
>news:pddbvu4peuhn3vel1aekb0vjbns0q2dl4m@4ax.com...
>> On Mon, 9 Dec 2002 23:43:05 +0100, "Jimmy" <spoerg@efter.den> wrote:
>>
>> >
>
>> Det ville hjælpe lidt hvis du gav os nogle tabeldefinitioner, samt
>> angav hvilken db du bruger. Her er et forsøg - ret det selv til.
>
>Det har du ret i.
>De kan ses nedenfor.

Ikke hvilken db du bruger. Jeg gætter dog, udfra "TYPE=MyISAM;", paa
at det er mySQL. Korrekt?

>> SELECT profiler.*, billeder.URL
>> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
>> billeder.profil_id AND billeder.Status = 'Active')
>
>Det ser umiddelbart fornuftigt ud, men er der ikke noget med, at ON ikke må
>bruges som en WHERE?

Nej. Der er noget om at visse sql-varianter ikke tillader vilkårlige
kriterier her - hvorfor det er relevant at vide hvilket db-system du
anvender. Mit gæt er at mySQL ikke forstår ovenstående.

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jens Gyldenkærne Cla~ (10-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 10-12-02 11:55

Jimmy skrev:

>> Det ville hjælpe lidt hvis du gav os nogle tabeldefinitioner,
>> samt angav hvilken db du bruger.

> De kan ses nedenfor.

Du har stadig ikke fortalt hvilken database der er tale om.


>> SELECT profiler.*, billeder.URL
>> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
>> billeder.profil_id AND billeder.Status = 'Active')
>
> Det ser umiddelbart fornuftigt ud, men er der ikke noget med,
> at ON ikke må bruges som en WHERE?

I MSSQL kan man tilsyneladende sætte et vilkårligt udtryk ind i ON-
delsætningen. Men rent logisk ville jeg nok omskrive Nis' eksempel,
så ON-delen kun indeholder udtryk der forbinder de to tabeller:

   SELECT profiler.*, billeder.URL
   FROM profiler LEFT JOIN billeder
   ON profiler.profil_id = billeder.profil_id
   WHERE billeder.Status = 'Active'
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jimmy (10-12-2002)
Kommentar
Fra : Jimmy


Dato : 10-12-02 11:59


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns92E0793702A5Bjcdmfdk@gyrosmod.dtext.news.tele.dk...
> Jimmy skrev:
>
> >> Det ville hjælpe lidt hvis du gav os nogle tabeldefinitioner,
> >> samt angav hvilken db du bruger.
>
> > De kan ses nedenfor.
>
> Du har stadig ikke fortalt hvilken database der er tale om.

MySQL.

> >> SELECT profiler.*, billeder.URL
> >> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
> >> billeder.profil_id AND billeder.Status = 'Active')
> >
> > Det ser umiddelbart fornuftigt ud, men er der ikke noget med,
> > at ON ikke må bruges som en WHERE?
>
> I MSSQL kan man tilsyneladende sætte et vilkårligt udtryk ind i ON-
> delsætningen. Men rent logisk ville jeg nok omskrive Nis' eksempel,
> så ON-delen kun indeholder udtryk der forbinder de to tabeller:
>
> SELECT profiler.*, billeder.URL
> FROM profiler LEFT JOIN billeder
> ON profiler.profil_id = billeder.profil_id
> WHERE billeder.Status = 'Active'

Ja, men så tager den kun de rækker med, der har billeder.Status = 'Active'.

Dette er jo ikke meningen.
Folk behøver jo ikke at have billede eller de kan have slettet det.
De skal stadig fremkomme i søgning.

Mvh
Jimmy



Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 12:12

On Tue, 10 Dec 2002 11:54:57 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>
>>> SELECT profiler.*, billeder.URL
>>> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
>>> billeder.profil_id AND billeder.Status = 'Active')
>>
>> Det ser umiddelbart fornuftigt ud, men er der ikke noget med,
>> at ON ikke må bruges som en WHERE?
>
>I MSSQL kan man tilsyneladende sætte et vilkårligt udtryk ind i ON-
>delsætningen.

Det er standard-SQL.

>Men rent logisk ville jeg nok omskrive Nis' eksempel,
>så ON-delen kun indeholder udtryk der forbinder de to tabeller:
>
>    SELECT profiler.*, billeder.URL
>    FROM profiler LEFT JOIN billeder
>    ON profiler.profil_id = billeder.profil_id
>    WHERE billeder.Status = 'Active'

Det giver ikke samme resultat. Hvis en person har billeder, men ingen
der er aktive, kommer han ikke med. Ideen var netop at benytte LEFT
JOIN-logikken - alle rækker fra den venstre tabel kommer _altid_ med.

Jimmy, hvis din version af mySQL understøtter subselects (det gør den
vist fra cirka version 4), kan du måske bruge.

SELECT profiler.*,
(SELECT billeder.URL
FROM billeder
WHERE billeder.id = profiler.id
AND Status = 'Active'
)
FROM profiler

Der kommer måske nogle problemer hvis samme person har mere end et
billede ...

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 12:12

On Tue, 10 Dec 2002 11:54:57 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>
>>> SELECT profiler.*, billeder.URL
>>> FROM profiler LEFT JOIN billeder ON (profiler.profil_id =
>>> billeder.profil_id AND billeder.Status = 'Active')
>>
>> Det ser umiddelbart fornuftigt ud, men er der ikke noget med,
>> at ON ikke må bruges som en WHERE?
>
>I MSSQL kan man tilsyneladende sætte et vilkårligt udtryk ind i ON-
>delsætningen.

Det er standard-SQL.

>Men rent logisk ville jeg nok omskrive Nis' eksempel,
>så ON-delen kun indeholder udtryk der forbinder de to tabeller:
>
>    SELECT profiler.*, billeder.URL
>    FROM profiler LEFT JOIN billeder
>    ON profiler.profil_id = billeder.profil_id
>    WHERE billeder.Status = 'Active'

Det giver ikke samme resultat. Hvis en person har billeder, men ingen
der er aktive, kommer han ikke med. Ideen var netop at benytte LEFT
JOIN-logikken - alle rækker fra den venstre tabel kommer _altid_ med.

Jimmy, hvis din version af mySQL understøtter subselects (det gør den
vist fra cirka version 4), kan du måske bruge.

SELECT profiler.*,
(SELECT billeder.URL
FROM billeder
WHERE billeder.id = profiler.id
AND Status = 'Active'
)
FROM profiler

Der kommer måske nogle problemer hvis samme person har mere end et
billede ...

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jens Gyldenkærne Cla~ (10-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 10-12-02 12:16

Jimmy skrev:

>> SELECT profiler.*, billeder.URL
>> FROM profiler LEFT JOIN billeder
>> ON profiler.profil_id = billeder.profil_id
>> WHERE billeder.Status = 'Active'
>
> Ja, men så tager den kun de rækker med, der har
> billeder.Status = 'Active'.

Ah - hvad så med:

   WHERE billeder.Status = 'Active'
   OR billeder.Status IS NULL

Jeg går ud fra at du vil have de rækker fra profiler hvor der enten
findes en tilsvarende række i billeder med status = 'Active' eller
også slet ikke findes et billede.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jimmy (10-12-2002)
Kommentar
Fra : Jimmy


Dato : 10-12-02 13:00


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns92E07CB5D8359jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Jimmy skrev:
>
> >> SELECT profiler.*, billeder.URL
> >> FROM profiler LEFT JOIN billeder
> >> ON profiler.profil_id = billeder.profil_id
> >> WHERE billeder.Status = 'Active'
> >
> > Ja, men så tager den kun de rækker med, der har
> > billeder.Status = 'Active'.
>
> Ah - hvad så med:
>
> WHERE billeder.Status = 'Active'
> OR billeder.Status IS NULL

Jeg har puttet parantes omkring da jeg har andre WHERE-kriterier også.

Det virker ikke helt efter hensigten, da min sortering nu er gået i hegnet.
Jeg kigger lige lidt mere på det så jeg har noget fornuftigt at spørge
videre om.

Jeg har fuld forståelse for at det er superbesværligt at hjælpe mig, når I
ikke kan se koden.

Tak for hjælpen indtil videre!

Mvh
Jimmy



Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 13:15

On Tue, 10 Dec 2002 12:15:34 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>
>> Ja, men så tager den kun de rækker med, der har
>> billeder.Status = 'Active'.
>
>Ah - hvad så med:
>
>    WHERE billeder.Status = 'Active'
>    OR billeder.Status IS NULL
>
>Jeg går ud fra at du vil have de rækker fra profiler hvor der enten
>findes en tilsvarende række i billeder med status = 'Active' eller
>også slet ikke findes et billede.

Det synes jeg ikke, problemformuleringen lægger op til. Hovedfokus er
på at alle profiler skal ud - hvilket de ikke kommer med ovenstående.

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Nis Jorgensen (10-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 10-12-02 13:15

On Tue, 10 Dec 2002 12:15:34 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>
>> Ja, men så tager den kun de rækker med, der har
>> billeder.Status = 'Active'.
>
>Ah - hvad så med:
>
>    WHERE billeder.Status = 'Active'
>    OR billeder.Status IS NULL
>
>Jeg går ud fra at du vil have de rækker fra profiler hvor der enten
>findes en tilsvarende række i billeder med status = 'Active' eller
>også slet ikke findes et billede.

Det synes jeg ikke, problemformuleringen lægger op til. Hovedfokus er
på at alle profiler skal ud - hvilket de ikke kommer med ovenstående.

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Jimmy (10-12-2002)
Kommentar
Fra : Jimmy


Dato : 10-12-02 21:00


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns92E07CB5D8359jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Jimmy skrev:
>
> >> SELECT profiler.*, billeder.URL
> >> FROM profiler LEFT JOIN billeder
> >> ON profiler.profil_id = billeder.profil_id
> >> WHERE billeder.Status = 'Active'
> >
> > Ja, men så tager den kun de rækker med, der har
> > billeder.Status = 'Active'.
>
> Ah - hvad så med:
>
> WHERE billeder.Status = 'Active'
> OR billeder.Status IS NULL

Det virker faktisk!
Det var en fejl i min kode, der gav mig problemer, da jeg forsøgte tidligere
:-/

Det virker ikke 100% dog.

Billeder.Status kan jo være 'Active' 'Awaits Approval' 'Passive' osv.
Hvis jeg beder om at et billede skal være 'Active' hentes alle de profiler,
som enten slet ikke har noget billede eller dem som har, og det skal så være
aktivt.

Det er min fejl - Jeg sagde tidligere at det skulle være 'Active'.

Jeg udtrækker nu vha. (billeder.Status <> '' OR billeder.Status IS NULL)

Det er nok en anormalitet i mit design, der gør, at jeg bliver nødt til
dette.

Takker til Nis og Jens.
Lærte endnu engang en masse

Mvh
Jimmy



Peter Lykkegaard (13-12-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 13-12-02 10:48

Som svar på skriblerier nedfældet af Jimmy :

> Jeg har et site hvor jeg har en tabel med en række profiler.
> Jeg har en anden tabel, hvor deres evt. billede ligger i (URL'en).
> Billedet kan være aktivt eller passivt og indeholder derfor også de
> gamle, slettede billeder.
>
Hvor langt er mySQL kommet med at implementere subselects?

På MSSQL kan man bruge følgende

SELECT P.*, (
SELECT B.Url FROM
Billeder B
WHERE B.profil_id = P.profil_id
AND B.Status = 'Active') AS Url
FROM Profiler P

Url vil være null hvis der ikke er et hit i tabellen billeder

mvh/Peter Lykkegaard




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