Just nu i M3-nätverket
Gå till innehåll
MajaX

SQL - frågor?

Rekommendera Poster

Jag ska registrera 2 föreningar och dessa har i sin tur 2 klubbar var. Jag ska registrera in alla medlemmar i dessa 4 klubbar. Jag tänker göra mina tabeller i Access - och sedan ska det gå att ta ut frågor genom SQL-kod, så jag kan få fram information om tex. vem som spelar i vilken klubb osv.

 

Jag har skapat 3 tabeller. En förenings-tabell där de båda föreningarna finns med, med namn och förenings-ID. Sedan har jag skapat en klubbtabell där de 4 klubbarna finns med, med namn, Förenings-ID och Klubb-ID. I min tredje tabell som jag kallat spelare finns uppgifter om namn, funktion i laget, registreringsnummer, ålder, lön, förenings-ID och Klubb-ID till varje medlem.

 

Jag har dragit relationer mellan tabellerna.

Vet inte om jag gjort rätt?

Kanske jag borde tänka om och skapa flera tabeller? Om någon är kunnig på detta och har lust så får Ni gärna tipsa mig med förslag.

 

Till mina problem??

När jag ska lägga till en ny medlem med INSERT-kommandot så fungerar det inte. Detta kommer upp: "Query input must contain at least one table or query". - vad betyder det? Och om jag vill ändra i en post - ändra åldern på en medlem tex. för att jag skrivit in det fel från början. Hur gör jag då?

 

Kan någon hjälpa mig med vad jag ska skriva i min SQL-kod?

 

Vad ska jag skriva för SQL-kod för att visa vilken medlem som tjänar mest i lön? (MAX - men sen då?)

 

Kanske någon har förslag på någon bra sida om SQL och sånt som tar upp sånt här på nätet? Gärna på Svenska då.

 

MajaX

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Till att börja med så kan du ju ta bort FöreningsId från spelartabellen. Du har ju KlubbId i spelartabellen och Klubbtabellen har FöreningsId så det blir onödig information.

 

En insert borde se ut nåt sånt här:

"INSERT INTO Spelare(namn, lagfunktion, registreringsnummer, ålder, lön, KlubbId) VALUES('Sune', 'Högerytter', 63536, 23, 10500, 1)"

Om du i tabellen har tex ålder, regnr och lön som tal ska du köra utan enkelfnutt, annars med.

 

En Update:

 

"UPDATE Spelare SET ålder = 25 WHERE namn = 'Sune'"

 

Select lön:

 

"SELECT lön, namn

FROM Spelare WHERE lön = (SELECT Max(lön) FROM Spelare)"

 

Vad gäller tabellerna hade jag nog satt SpelarId i tabellen Spelare. Du har ju FöreningsId och KlubbId som räknare antar jag så varför inte spelarId?

Om du har ett antal olika spelartyper(tex forward, back, målvakt) så hade jag nog lagt in en tabell med Spelartyper också och lagt in det Id:t i tabellen Spelare.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Tack så mycket för tidigare hjälp, Steve. Nu till nya problem:

 

Jag vill kunna visa vilka av spelarna som spelar i olika föreningar men i samma klubb - hur gör jag då?

 

Tex. så här: Säg att vi i tabellen Spelarna har en spelare med namn Sune och en annan med namn Bert. De är med i hockeylaget båda två, men de spelar också fotboll. Hur ska jag i en SQL-fråga kunna visa endast deras namn och vilken klubb de är med i och vilken sport de utövar? Det blir ju bara en klubb, men två sporter resp. två föreningar.

 

De är inskrivna i båda klubbarna (Hockey + Fotboll) så om jag visar alla spelare så kommer deras namn med på två rader vardera eftersom de utövar två sporter vardera. Är detta fel gjort? Skulle jag ha tänkt annorlunda? De har olika RegNr i olika föreningar. Ett för Hockey´n och ett annat för fotbollen.

 

Om jag tex vill visa deras namn (Sune och Bert) och alla andra som spelar Hockey, men ingen annan ur fotbollen - hur ska en sån fråga se ut?

 

Så här ser mina tabeller ut: Tabell 1 = Spelare. Kolumner = RegNr, Fornamn,Efternamn, Alder, Lon, Funktion, Sport, KlubbID, ForeningsID.

 

Tabell 2 = Klubbar. Kolumner = Klubbnamn, KlubbID.

 

Tabell 3 = Föreningar. Kolumner = Föreningsnamn, FöreningsID, KlubbID.

 

Jag hoppas det finns någon smartskalle därute nånstans som kan hjälpa mig. Hoppas Ni förstår mig och mina undringar.

 

/Maja X

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Eftersom du vill visa vilken klubb de är med i och villken sport de utövar så blir det ju såklart 2 träffar på vardera Sune och Bert.

Vet inte riktigt hur du menar, innehåller en förening en eller flera klubbar? Eller tvärtom, att en klubb kan innehålla en eller flera föreningar?

 

Med risk för att låta tjatig så hade jag gjort om databasen så du slipper redundans, dvs samma info på flera ställen.. Typ nåt sånt här hade funkat:

 

Tabell 1

Spelare: SpelarID, Fornamn, Efternamn, Alder

 

Tabell 2

SpelareKlubb: SpelarId, KlubbId, RegNr, Funktion, Lon

 

Tabell 3

Klubbar: KlubbID, Klubbnamn, Sport

 

Tabell 4

KlubbID, FöreningsID

 

Tabell 5

Föreningar: FöreningsID, Föreningsnamn

 

Tabell 2 kan ha samma Spelar & KlubbID flera ggr, fast inte på samma rad, funktion och lön lägger man också dit för att de kan ha olika funktion eller lön beroende på vilken sport(Klubb) man avser. Sport flyttar jag till Klubbtabellen för att få den kopplad till Klubb, inte till spelare.

 

Tabell 4 är en mellantabell för att koppla klubb till förening, även de kan förekomma flera ggr men inte samma kombination på flera rader.

 

Detta är nog inte vad du ville ha, men jag tror du skulle få det mycket lättare att konstruera SQL:en på detta sätt...

Annars(med dina tabeller) för att visa alla som spelar hockey:

"SELECT DISTINCT(namn) FROM Spelare WHERE Sport = 'Hockey'"

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Frågan du skriver fungerar självklart om jag vill visa alla som spelar hockey. Men mitt stora problem är att jag vill visa de spelare (Sune och Bert) som spelar Hockey OCH Fotboll.

 

Går det att ställa en sådan fråga till mina tabeller utan att göra om tabellerna?

 

Och sedan om jag vill visa dessa två som utövar både hockey och fotboll + alla andra som utövar den ena av dessa sporter?

 

Tack så hemskt mycket för hjälpen jag fått av dig Steve, men om det går att fixa detta utan att göra om tabellerna så vore det "guld"!

 

/Maja X

 

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ja, men det borde väl bli så här då:

 

"SELECT DISTINCT(namn) FROM Spelare WHERE Sport = 'Hockey' OR Sport = 'Fotboll'"

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Detta funkar ju inte om du ska visa även klubb och sport eftersom raden blir DISTINCT eftersom sporterna skiljer sig åt, då får du flera träffar. Men det går ju att fixa när du loopar igenom resultatet och visar det??

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Re:Steve - Vaddå loopar?

 

Re:Steve - Om jag nu följer ditt råd och använder mig av dina tabellförslag, har du då något tips på hur jag ska lösa det där med de två spelarna som spelar både fotboll och hockey?

 

Tänk dig att det finns två föreningar och dessa har i sin tur två klubbar var. En av föreningarna har alltså fotboll och hockey som sporter i varsin klubb. Det finns då en Sune och en Bert som båda spelar fotboll och hockey. Hur ska jag visa detta i tabellform när det jag vill ha fram är deras förnamn och efternamn och klubbarna de tillhör (alltså både fotboll och hockey)?

 

Och om jag sedan vill visa dessa båda spelare och fotbollslaget´s alla andra spelare. Hur gör jag då?

 

Det blir tjatigt det här, men jag har inte lyckats lösa detta och vägrar ge upp.

 

/Maja

 

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Men du vill fortfarande ha dem på bara en rad, eller? Du ville ju inte ha Sune och Bert att dyka upp på 2 rader var enligt någon av dina tidigare inlägg?

 

Det går ju inte om du även ska visa klubbarna de tillhör, eftersom de då hamnar på 2 olika.

Vad jag menar med loopa är ju det att du ska väl antagligen skriva ut detta på nåt sätt? På en hemsida med ASP eller liknande?

Då kan man ju ställa flera frågor och kombinera recordseten, fast detta är ju ett kapitel för sig, hur man loopar i ett recordset.

 

Om du kör tex den här frågan:

 

"SELECT Spelare.Fornamn, Spelare.Efternamn, Klubbar.Klubbnamn

FROM Spelare INNER JOIN Klubbar ON Spelare.KlubbID = Klubbar.KlubbID

WHERE Spelare.Sport = 'Fotboll'"

 

Då får du ju fram alla som spelar fotboll, men tyvärr får du inte med klubbnamnet för ishockey bland de som spelar båda sporterna eftersom du söker på Fotboll.

Jag tror inte du får ut den info du vill ha på en fråga, även om du gör om det till min databasmodell.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Det gör ingenting om namnen hamnar på två rader vardera. Jag har själv provat med JOIN men tycker dessa kommandon är lite svåra. Jag ska prova det du skriver.

 

 

ETT ANNAT FÖRSLAG JAG VAR INNE PÅ:

Om jag tex. skulle skapa två nya tabeller som heter HOCKEY och FOTBOLL och har två kolumner med förnamn och efternamn i vardera tabell. Ska det då inte gå att skapa en fråga som visar namnen som är dubletter i båda tabellerna. Jag har försökt med detta - men får SYNTAX-fel i Access97.

 

SELECT * FROM HOCKEY

INTERSECT

SELECT * FROM FOTBOLL

 

Kan man inte göra så? INTERSECT ska ju returnera de rader som hittas av båda frågorna. Alltså borde denna fråga visa despelare som finns med i bådalagen. Missar jag kolumner eller något annat?

 

Om man skulle få detta att fungera och även ha med kolumn med sport i varje tabell - då kanske man alla fall kunde få ett svar?

 

/Maja X

 

 

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Har aldrig använt INTERSECT, kanske UNION funkar? Fast då måste bägge tabellerna ha samma antal kolumner.

 

Du behöver inte göra fler tabeller, någon av mina tidigare SELECT-satser borde funka, tycker jag...

 

Vad du ska tänka på när du gör databaser är att undvika redundans, dvs ha samma information i flera tabeller.

Man vill ju inte behöva göra flera frågor om man tex vill ändra namn med en UPDATE. Eller om man ska lägga till spelare så vill man ju bara göra det i en enda tabell, och inte behöva lägga in samma namn i flera tabeller.

 

Om du kikar på mitt förslag så ser du att jag försöker sära på informationen.

Mitt tips är nog ändå att du läser lite om relations-databaser, och försöka använda INNERJOIN mfl kommandon.

Jag har jobbat på företag där de använt databaser som varit rena skräckexemplen, så tom proffsen kan ha problem med det....

 

Men jag lovar, rätt vad det är klickar det till och så kommer du att haja precis hur allt hänger ihop.

Jag har haft en suverän tunn bok om sql, du kan få namnet på den om jag hittar den hemma nånstans ;)

Förresten, vad använder du? Access, SQL-Server, eller vadå? Och var ska du visa informationen? på en hemsida?

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×