Avatar billede zephyrus Nybegynder
17. maj 2004 - 23:48 Der er 9 kommentarer og
1 løsning

Hjælp til JOIN

I have this select statement:

Jeg har følgende select forespørgsel:

SELECT distinct bp_emner.ID as bp_emner_ID, bp_emner.emne as bp_emner_emne, bp_indlaeg.emne_id as bp_indlaeg_emne_id, bp_indlaeg.oprettet as bp_indlaeg_oprettet, bp_indlaeg.indlaeg as bp_indlaeg_indlaeg FROM bp_emner, bp_indlaeg
where bp_emner.forum_id = 1 and bp_emner.ID = bp_indlaeg.emne_id


Det give mig følgende resultat:

+-------------+---------------------------+--------------------+---------------------+------------------------------------+
| bp_emner_ID | bp_emner_emne            | bp_indlaeg_emne_id | bp_indlaeg_oprettet | bp_indlaeg_indlaeg                |
+-------------+---------------------------+--------------------+---------------------+------------------------------------+
|          2 | Velkommen til dette forum |                  2 | 2004-05-02 19:57:00 | Some crap here                    |
|          2 | Velkommen til dette forum |                  2 | 2004-05-02 23:51:00 | Nice                              |
|          12 | Jeg tester lige          |                12 | 2004-05-17 21:13:02 | Dette er blot en lille test mere ! |
+-------------+---------------------------+--------------------+---------------------+------------------------------------+


Men det jeg skal frem til er at den kun returnere de 2 SIDSTE rækker.

Hvordan laver jeg den begrænsning ???

Det kan være at det er nemmest lige at kopiere resultatet ud i notepad, da det så er lidt mere overskueligt.
Avatar billede tjp Mester
18. maj 2004 - 01:26 #1
Er det de 2 sidste rækker eller kolonner?

Hvis du rent faktisk mener kolonner, så:

SELECT bp_indlaeg.oprettet as bp_indlaeg_oprettet, bp_indlaeg.indlaeg as bp_indlaeg_indlaeg FROM bp_emner, bp_indlaeg
where bp_emner.forum_id = 1 and bp_emner.ID = bp_indlaeg.emne_id
Avatar billede zephyrus Nybegynder
18. maj 2004 - 02:57 #2
Nej, jeg mener rent faktisk rækker (ROWS).
Avatar billede arne_v Ekspert
18. maj 2004 - 07:09 #3
Prøv:

SELECT distinct bp_emner.ID as bp_emner_ID, bp_emner.emne as bp_emner_emne, bp_indlaeg.emne_id as bp_indlaeg_emne_id, MAX(bp_indlaeg.oprettet) as bp_indlaeg_oprettet, bp_indlaeg.indlaeg as bp_indlaeg_indlaeg
FROM bp_emner, bp_indlaeg
WHERE bp_emner.forum_id = 1 and bp_emner.ID = bp_indlaeg.emne_id
GROUP BY bp_emner_ID, bp_emner_emne, bp_indlaeg_emne_id
Avatar billede zephyrus Nybegynder
18. maj 2004 - 13:25 #4
Hej Arne v, tak for dit svar. Jeg havde faktisk prøvet den du har skrevet. Jeg havde blot skrevet GROUP BY delen før WHERE clausulen. :-)

Men det du skriver virker, så her er point til dig.
Avatar billede zephyrus Nybegynder
18. maj 2004 - 13:26 #5
øhhh hvordan er det nu lige jeg tildeler point :-|
Avatar billede zephyrus Nybegynder
18. maj 2004 - 13:44 #6
Hov....jeg har lige opdaget at den sql du har sendt faktisk returnere den forkerte: bp_indlaeg.indlaeg.

Hvordan forhindre jeg lige det. Den returnere den bp_indlaeg.indlaeg som hører sammen med den række jeg faktisk har sorteret fra
Avatar billede arne_v Ekspert
18. maj 2004 - 13:50 #7
Brug af ikke aggregerede felter som ikke er i GROUP BY er en ikke-standard
MySQL-specifik feature og er nok unpredictable med hensyn til hvad den
vælger.

Umiddelbart kan jeg kun se 2 løsninger:

1)  flytte logikken til applikationen

2)  bruge sub select (kræver MySQL 4.1.x)
Avatar billede zephyrus Nybegynder
18. maj 2004 - 14:08 #8
For at beskrive hvad det er jeg helt nøjagtigt vil have:

Jeg har 3 tabeller:

bp_emner:
bp_emner.ID
bp_emner.emne
bp_emner.oprettet
bp_emner.locked
bp_emner.read_count
bp_emner.forum_id

bp_brugere:
bp_brugere.ID
bp_brugere.brugernavn

bp_indlaeg:
bp_indlaeg.ID
bp_indlaeg.emne_id (relation til bp_emner)
bp_indlaeg.forfatter_id (relation til bp_brugere)
bp_indlaeg.oprettet

Jeg vil vise de rækker i bp_emner som har bp_emner.forum_id = 1
(det giver 2 rækker)

Jeg vil også have at den skal vise den bp_indlaeg.oprettet (dato) fra bp_indlaeg
med den seneste dato. Og KUN den ene.

Samtidigt vil jeg have at den viser den bp_brugere.brugernavn fra bp_brugere hvor
bp_brugere.ID er = bp_indlaeg.forfatter_id

Men jeg vil stadig kun have de 2 rækker.


Jeg kunne vel have gjort noget andet som f.eks. at først lave det ene opslag i
bp_emner og derefter lave et opslag i bp_indlaeg for hver række der blive returneret.
Og igen lave et opslag i bp_brugere ud fra den returnering jeg får fra bp_indlaeg.
Men jeg har prøvet dette og det bliver så komplekst at det bliver NOGET sløvt.

Jeg ville meget gerne have dette smedet sammen i ET statement.
Avatar billede arne_v Ekspert
18. maj 2004 - 22:23 #9
Det er så vidt jeg kan vurdere kun muligt med MySQL 4.1 ...
Avatar billede zephyrus Nybegynder
04. juli 2005 - 17:23 #10
lukket
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