Avatar billede mr_bambi Nybegynder
24. april 2003 - 04:15 Der er 1 kommentar og
1 løsning

LEFT JOIN og en slags DISTINCT

Jeg er ved at lave et system til offentliggørelse af pressemeddelelser, hvor jeg skal kunne vælge en skribent, der har skrevet pressemeddelelsen (pm), og en titel, som han har skrevet den under (en skribent skal altså kunne have to forskellige titler til to forskellige pm'er).

Til dette har jeg tre tabeller:
* vuvi_press - pressemeddelelsen, overskriften, et timestamp, et id på skribenten, og et id på den titel, skribenten har skrevet pm'en under.
* vuvi_users - skribentens id og navn mm.
* vu_titles - titlens id og selve titlen, samt en parent, da der er forskellige niveauer af titler.

Det jeg skal, er at hente alle recordset ud fra vuvi_press sorteret efter timestamp'et, og så vil jeg LEFT JOIN'e mig til skribentens navn og titlen til den aktuelle pressemeddelelse i samme db-kald.
Problemet er blot, at hvis den samme skribent har skrevet flere pm'er under x forskellige titler, så kommer hver pm med i result-settet x gange med samme navn, men forskellige titler. Jeg har sat en DISTINCT på kaldet, men det afhjælper jo ikke dette problem.

Mit kald ser ud som følger:

SELECT DISTINCT
  press1.header,
  press1.author, vuvi_users.name,
  press2.author_title, vu_titles.title,
  press1.content,
  press1.url,
  DATE_FORMAT(press1.timestamp, '%e/%c %Y') AS timestamp
  FROM
  vuvi_press AS press1 LEFT JOIN vuvi_users ON press1.author = vuvi_users.id,
  vuvi_press AS press2 LEFT JOIN vu_titles ON press2.author_title = vu_titles.id
  ORDER BY press1.timestamp DESC;


Det jeg tror, mit problem er, at når jeg join'er vuvi_press på vu_titles, så finder den alle de titles, som skribenten har deri, og så tager den hver pm med tilsvarende antal gange.
Det jeg altså skal bruge, er en metode, hvor den for hver enkel række i vuvi_press går over og slår op i vu_titles, og så returnerer KUN den titel sammen med den tilsvarende række.

Jeg håber, I forstår hvad jeg mener, og at der er nogen, der kan hjælpe mig.

Mvh
Bjørn Amdi Sloth
Avatar billede mr_bambi Nybegynder
24. april 2003 - 04:33 #1
En lille tilføjelse...

Faktisk er det alle de titler, der overhovedet er tildelt nogle, der bliver join'et over, og går igen for hver enkelt pressemeddelelse.
I kan se et eksempel på http://test.mr-bambi.dk/presse.php4

Som I kan se, er der frigivet to pressemeddelelser - den sidste nye af Bjørn Amdi Sloth, hvor jeg valgte titel af webmaster, og den forrige er skrevet af Erich Erichsen, og han fik titel af formand. Som det fremgår af listen nederst på ovenstående side, så bliver begge pm'er gentaget to gange - begge med den korrekte skribents navn, men med begge titler.
Det der undrer mig, er hvorfor den ikke gør det med skribentens navn, der jo er join'et på nøjagtig samme måde som titlen via id'et.

Håber fortsat, at der er nogen, der kan hjælpe mig.

/Bjørn Amdi Sloth
Avatar billede mr_bambi Nybegynder
24. april 2003 - 05:39 #2
Hmm... Jeg gjorde det åbenbart sværere for mig selv, end det var nødvendigt. Jeg havde slet ikke behøvet at lave OUTER JOIN's (vuvi_press LEFT JOIN vuvi_users). Det var rigeligt med INNER JOIN (vuvi_press, vuvi_users, vu_titles).

Query'et ser nu sådan ud:
SELECT
  vuvi_press.header,
  vuvi_press.author, vuvi_users.name, vuvi_users.email,
  vuvi_press.author_title, vu_titles.title,
  vuvi_press.content,
  vuvi_press.url,
  DATE_FORMAT(vuvi_press.timestamp, '%e/%c %Y') AS timestamp
  FROM vuvi_press, vuvi_users, vu_titles
  WHERE vuvi_press.author = vuvi_users.id
  AND vuvi_press.author_title = vu_titles.id
  ORDER BY vuvi_press.timestamp DESC;

Og så er det ikke engang nødvendigt at lave den DISTINCT mere.

/me hapser lige pointene igen!
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