|
| 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
| |
|
|