Avatar billede rrm Nybegynder
10. juni 2004 - 23:26 Der er 13 kommentarer og
1 løsning

Problem med subquery i from betingelse

Davs...

Jeg forsøger at lave følgende query:
select * from (select name from runeRent)

men får følgende fejl:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select name from runeRent)' at line 1

Hvad gør jeg galt??? Benytter forresten mysql version 4.0.

På forhånd tak
rrm
Avatar billede arne_v Ekspert
10. juni 2004 - 23:27 #1
MySQL 4.0 understøtter ikke subqueries.
Avatar billede arne_v Ekspert
10. juni 2004 - 23:28 #2
Avatar billede rrm Nybegynder
10. juni 2004 - 23:40 #3
suk, må vist være lidt træt i det jeg åbenbart overså det... :(

Er der så en anden måde at gøre uden at skulle foretage to query's???

hilsen
rrm
Avatar billede arne_v Ekspert
11. juni 2004 - 21:45 #4
Ja normalt kan man opnå samme resultat med en snedig JOIN.

Hvis du forklarer hvad du vil så kan jeg prøve at skitsere en alternativ
løsning (jeg tillader mig at formode at " select * from (select name from runeRent"
kun var for at illustere subquery).
Avatar billede rrm Nybegynder
14. juni 2004 - 22:32 #5
->Hvis du forklarer hvad du vil så kan jeg prøve at skitsere en alternativ
løsning (jeg tillader mig at formode at " select * from (select name from runeRent"
kun var for at illustere subquery).
Det har du ret i.. :)

Jeg har to tabler, den ene indeholder en del informationer om et elementer og den anden indeholder informationerne om nogle bruger. I den først har jeg et brugerID som matcher et id-felt i den anden. Dette id er unikt. Jeg vil da have at brugerID?et bliver slået op i den anden tabel for derefter at returnere navnet på den pågældende bruger. Denne information skal så kombineres med en select fra den første tabel.

Har forstillet mig følgende: (ved godt at den ikke virker i version 4.0)
select ... (select tabel2 from user where id = item.username) from tabel1 AS item where ? orderBy .. limit ...

Med hensyn til join, er det så natural join du tænker på???

På forhånd tak..
rrm
Avatar billede arne_v Ekspert
14. juni 2004 - 22:36 #6
Er det ikke bare:

SELECT item.xxx,item.yyy,user.username
FROM item,user
WHERE item.userID=user.ID

?
Avatar billede rrm Nybegynder
15. juni 2004 - 18:44 #7
jo, det har i, det virker dog kun næsten... Jeg bruger følgende sætning:

select item.id, item.title, item.year, item.company, item.type, item.rentetBy, if item.rentetBy>0 then rent.name end if from runeItem as item, runeRent as rent if item.rentetBy>0 then where item.rentetBy = rent.id end if

Men jeg har lidt problemer med if-strukturen, ved du hvordan de skal dannes???

Skal lige nævnes at rækken rentetBy indeholder 0, hvis den ikke peger på et id et bruger tablen og ellers id nummeret.
Avatar billede arne_v Ekspert
15. juni 2004 - 18:48 #8
if item.rentetBy>0 then where item.rentetBy = rent.id end if

må vel skulle være:

WHERE item.rentetBy <= 0 then OR item.rentetBy = rent.id
Avatar billede arne_v Ekspert
15. juni 2004 - 18:49 #9
if'en i select listen tror jeg bare du skal fjerne og så lade din applikation
smide væk

alternativt kan du erstatte

if item.rentetBy>0 then rent.name end if

med

if(item.rentetBy>0,rent.name,'')
Avatar billede rrm Nybegynder
15. juni 2004 - 20:48 #10
Hvis jeg bruger: WHERE item.rentetBy <= 0 then OR item.rentetBy = rent.id, får jeg dannet krydsproduktet af de to tabler og får paret rentetBy med id og får det rigtige name. Men de steder hvor rentetBy = 0, optræder da 2 gange idet de bliver paret med de element i runeRent tablen (2 elementer heri). Kan du fjerne disse "duplikater", der er ens pånær deres name felt.
Avatar billede arne_v Ekspert
15. juni 2004 - 20:52 #11
Jeg er vist lost. Jeg forstå ikke problem stillingen.

Der er iøvrigt er "then" for meget. Jeg mente:

WHERE item.rentetBy <= 0 OR item.rentetBy = rent.id

men det har du sikkert fundet ud af.
Avatar billede rrm Nybegynder
15. juni 2004 - 21:05 #12
beklærer, hvis jeg ikke har forklaret mig tydlig nok...

Problemstilling består i at jeg har to tabler item og rent. I item har jeg en kolonne rentetBy der indeholder et tal, der matcher et id i rent tablen, hvis den er lånt ellers indeholder den 0. Så det jeg forsøger at gøre er at lave en select der henter næste alle element ud af item tablen og samtidig henter navnet fra rent tablen udfra hvilken værdi der står i rentetBy kolonnen. Dvs. hvis den indeholder 2, så hentes navnet på brugeren med id=2 og tilføjes til de andre elementer (dvs de værdier der hentes fra item tablen).
F.eks hvis der står name=Shrek, producent=DreamWorks, rentetBy=2 i item tablen og id=2, name=hans i rent tablen, så skal den resultere med name=Shrek, producent=DreamWorks, rentetBy=2 og name=Hans.
Avatar billede arne_v Ekspert
15. juni 2004 - 21:10 #13
Har du prøvet:

SELECT ...
FROM item LEFT JOIN rent ON item.rentetBy = rent.id

?
Avatar billede rrm Nybegynder
15. juni 2004 - 21:13 #14
Det ser skam ud til at virke, tak skal du have for hjælpen.... :) Den have jeg vist ikke prøvet....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester