Gå til innhold

LØST: Finne riktig select- kommando i MySQL


Anbefalte innlegg

Hei!

 

Via et admin- grensesnitt skal det være mulig å endre/ slette innlegg som ligger under nyhetspubliseringer. For å velge riktige ID- er til utskrift i form av forms, trenger jeg en select som henter hver nyhetspublisering som har et eller flere innlegg knyttet til publiseringen. Har prøvd LEFT JOIN og flere forskjellige måter å få til dette på, men foreløpig blir hver nyhetsoverskrift printet ut like mange ganger som antall innlegg. (Hver nyhets- id/ overskrift skal kun printes ut EN gang, uavhengig av hvor mange innlegg som ligger under nyhetspubliseringen. ) I tabellen tabell_beskjeder, knyttes feltet PUBLISERINGSID opp mot felt for ID i tabell_artikler.

 

Følgende spørring returnerer overskriften like mange ganger som det finnes innlegg til publiseringen;

 

$select = "SELECT tabell_artikler.ID , tabell_artikler.OVERSKRIFT

FROM tabell_artikler

LEFT JOIN tabell_beskjeder ON tabell_artikler.ID = tabell_beskjeder.PUBLISERINGSID

 

 

WHERE (tabell_artikler.SLETTET != '1')

ORDER BY DATO_PUBLISERT DESC";

 

Noen som umiddelbart ser en løsning på dette? På forhånd takk.

 

EDIT: Ser for meg at jeg trenger en COUNT(?) som teller antall tabell_beskjeder.PUBLISERINGSID for hver rad jeg vil ha returnert, og at dersom denne verdien er mer enn null, får jeg verdien skrevet ut. Ellers ikke.

Endret av funkyboy
Lenke til kommentar
Videoannonse
Annonse

En left join heter verdier fra den ytre tabellen (tabell_artikler) også hvis det ikke finnes noen fremmednøkkel for ytre tabells id i indre tabell (tabell_beskjed). En right join gjør det motsatte.

 

En join eller natural join joiner bare de tupler i ytre og indre tabell hvor ytre tabells id også finnes i den indres....

 

Var det forståelig? Jeg er litt usikker på om jeg har forstått hva jeg har skrevet selv.

Lenke til kommentar
En left join heter verdier fra den ytre tabellen (tabell_artikler) også hvis det ikke finnes noen fremmednøkkel for ytre tabells id i indre tabell (tabell_beskjed). En right join gjør det motsatte.

 

En join eller natural join joiner bare de tupler i ytre og indre tabell hvor ytre tabells id også finnes i den indres....

 

Var det forståelig? Jeg er litt usikker på om jeg har forstått hva jeg har skrevet selv.

 

Det finnes nøkkel i tabell_beskjed som samsvarer med ID i tabell_tabell_artikler ja. Men poenget er at min spørring (etter gjentatte forsøk) returnerer:

 

Nyhetspubliseringsoverskrift 1

Nyhetspubliseringsoverskrift 1

Nyhetspubliseringsoverskrift 1

 

Nyhetspubliseringsoverskrift 2

Nyhetspubliseringsoverskrift 2

 

Når jeg egentlig vil ha:

 

Nyhetspubliseringsoverskrift 1 // (3)

 

Nyhetspubliseringsoverskrift 2 // (2)

 

.. Om du skjønner. :D

Lenke til kommentar
En left join heter verdier fra den ytre tabellen (tabell_artikler) også hvis det ikke finnes noen fremmednøkkel for ytre tabells id i indre tabell (tabell_beskjed). En right join gjør det motsatte.

 

En join eller natural join joiner bare de tupler i ytre og indre tabell hvor ytre tabells id også finnes i den indres....

 

Var det forståelig? Jeg er litt usikker på om jeg har forstått hva jeg har skrevet selv.

Først og fremst et svar på det siste, det er jeg også :) En liten oppklaring følger.

 

En left (outer) join betyr at du skal ha alle radene fra den første tabellen, og matche opp mot den andre tabellen der SAMMENLIGNINGEN er tilfredsstilt. Det er intet krav om likhet eller fremmednøkkel. Nedenforstående er fult tillat:

 

select b.vekt, p.pris from brev b left outer join porto p on (b.vekt between p.fra_vekt and p.til_vekt)

 

Pris blir her null om det ikke finnes noen porto for den aktuelle vekten.

 

Når det gjelder et naturlig join, så har ikke det noe (eksplisitt) predikat, eller sammenligning om du vil. De kolonnene i de to tabellene som har samme navn brukes til sammenligning, f eks

 

select k.navn as kommune, s.navn as sted 
from kommune k natural join sted s

 

Her kan man tenke seg at kommune_id (evt kommune_nummer hvis man drister seg til å bruke en naturlig nøkkel) eksisterer i begge tabeller, og blir brukt til sammenligning.

 

Et naturlig join er alltid et ekvijoin, altså at man bruker likhetsoperator for sammenligning. Et (inner) join derimot kan bruke hvilken som helst sammenligningsoperator, som <, >, =, <> og between.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...