Gå til innhold

[Løst] SQL: Vise info fra én tabell og telle antall ganger ID dukker opp i en annen tabell.


Anbefalte innlegg

Skrevet

Hei!

 

Lurer på hvordan jeg kan kombinere dette i en spørring.

 

Først hva jeg har:

Tabell vaktinfo: vaktid, navn, telefonnumre etc

Tabell vaktjobb: id, vaktid, dato

 

Og hva jeg vil:

Jeg vil vise alle kolonner fra vaktinfo og i tillegg ha en kolonne der jeg teller hvor mange ganger hver enkelt vaktid dukker opp i tabellen vaktjobb.

 

Klarer dette i egen spørring (SELECT count(id) FROM vaktjobb WHERE vaktid = 1) men da må jeg sende en spørring pr rad på vaktinfo.. Vet det skal gå an å gjøre dette på en mer effektiv måte men jeg har lett meg blå :S

Videoannonse
Annonse
Skrevet

Her kan du bruke GROUP BY. Litt usikker på om dette blir rett, men du kan prøve:

 

SELECT vi.*, COUNT(vj.vaktid)
FROM vaktjobb vj, vaktinfo vi
WHERE vj.vaktid = vi.vaktid
GROUP BY vj.vaktid

Skrevet

Jihu! Der fant jeg ut av det :D

 

SELECT vaktinfo.*, COUNT(vaktjobb.vaktid)
FROM vaktinfo
LEFT JOIN vaktjobb ON vaktinfo.vaktid = vaktjobb.vaktid
GROUP BY vaktinfo.vaktid;

 

Takk for hjelpen :)

Skrevet

Ja, joins må brukes da ja. ;)

 

Jeg har sjelden brukt aggregat-funksjoner når jeg har hentet informasjon fra flere tabeller, er en lite god ide på forumdatabasen vår...

Skrevet (endret)

Hmms... Lurer på om jeg skal ta det et steg videre..

tabell vaktinfo: vaktid, navn, telefon etc.

tabell arrangement: arrid, dato, type/navn etc.

tabell vaktjobb: id, vaktid, arrid.

 

Foreløpig har jeg følgende spørring som viser info samt finner ut antall ganger vedkommende forekommer i vaktjobb:

SELECT
vaktinfo.*,
COUNT(vaktjobb.vaktid) AS antallvakter,
DATE_FORMAT(startet,"%e/%c %Y") AS startet2k,
DATE_FORMAT(sistinnlogget,"%e/%c %Y") AS sistinnlogget2k
FROM vaktinfo
LEFT JOIN vaktjobb ON vaktinfo.vaktid = vaktjobb.vaktid
WHERE (suspended = 0)
GROUP BY vaktinfo.vaktid 
ORDER BY styreflag DESC, navn ASC

 

antallvakter er antall forekomster i vaktjobb for hver enkel ansatt/vakt.. Denne kolonnen kunne jeg tenke meg å dele i to igjen: en hvor datediff(curdate(),arrangement.dato) er positiv og en der den er negativ slik at jeg kan se antall vakter de har jobbet og antall vakter de er satt opp på å jobbe.

 

Har klart å feste på arrangementstabellen slik at jeg kun filtrerte (WHERE) vaktene utfra dette kriteriet men sliter litt med å forstå hvordan jeg skal få det inn i en count-funksjon.

Endret av Melkekartong
  • 3 uker senere...
Skrevet (endret)

Til ettertanke blir det kanskje lettere å spørre en eller to ganger pr vaktinfo-rad fremfor å lage én helvetes innvikla spørring...

Det kan jo godt være at det funker bedre ja. ;)

 

Vet ikke hvilken database du bruker, men i f.eks Postgres så får du ikke noe ytelsestap å snakke om hvis du skriver spørringer på denne formen:

 

SELECT * FROM

( SELECT .... ) as FOO

LEFT JOIN (SELECT ...) AS BAR on FOO.id = BAR.id

 

Ganske nyttig hvis du jobber med aggregates og skal aggregere på flere verdier i samme spørring.

 

Det er også mulig å bruke CASE hvis du vil unngå å gå igjennom samme tabell flere ganger:

 

SELECT SUM(CASE WHEN xxx THEN 1 ELSE 0 END) as working,

SUM(CASE WHEN yyy THEN 1 ELSE 0 END) as should_work

FROM ...

WHERE ...

GROUP BY ...

Endret av blackbrrd

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