Har ett problem med att skapa en vy i mysql. På vilket sätt blir det fel? Får följande fel: Vad vill du att de två sista kolumnerna ska vara? Såg att det var ett syntax fel, men får fortfarande fel. Prova först att använda v_test själv; "SELECT * FROM v_test" i något testfönster. Funkar det? Inga problem att skapa och köra dessa vyer, varken v_test eller test2. Om du försöker köra nedanstående SQL-sats förstår jag om du får fel. I fältlistan (efter SELECT) försöker du nämligen hämta från en tabell/vy som du inte har med i tabellreferensen (efter FROM). Om jag gör en SELECT-SATS på det som jag har tänkt skapa en vy med som ser ut så här: Opps, höll på att skriva när du kom med svaret. Var för snabb med att kolla detta noga. Jag vet inte hur du vill koppla ihop tabellerna, det vet du bäst själv, men du skall nog ha en JOIN med ett villkor. Vet inte hur jag löser detta, men vill framförallt att kurstillfälle_akronymLarare, och , akronymLarare, skall stämma överens. Ser mycket bra ut, men en liten detalj som gör att jag inte får ut allt (kanske en miss från mig ) och det är att det fattas en rad i utskriften. Vet inte, men denna vy tar fram alla kurser Och om du tar SELECT * FROM v_test WHERE akronymLarare = "CJH", vad får du då? Kör jag select-satsen som du sa, så är det inga problem. Får fram allt som det ska. Skäms nästan att säga det, men nu är den löst. Så är det ibland... =) Behöver nog hjälp med att få denna att fungera Du måste nog börja testa att debugga frågorna själv; ta bort allt krafs och försök med en enkel fråga, och närma dig steg för steg den frågan du vill komma fram till. Tack för att ni har stått ut med dessa frågor, men i bland kan jag inte släppa det som jag blivit insnöad på. Kan vara svårt att se logiken på det hela ibland. Nog ingen optimal lösning, eller? Det är exakt det du skulle göra. =)mysql + skapa vy
Har 3 tabeller som jag vill slå ihop till en vy så att jag får fram all information i denna.
Min första vy ser ut så här
CREATE VIEW v_test AS SELECT akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare,
(YEAR(CURDATE())-YEAR(foddLarare))
AS Ålder
FROM Larare ORDER BY foddLarare;
Och min andra ser ut så här
CREATE VIEW v_Kursen AS
SELECT Kurstillfälle.*, Kurs.* FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
Gjorde ett försök med följande men fick inte ihop det.
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, v_test,*, FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
Det är säkert någon som kan detta och vill hjälpa mig.Sv: mysql + skapa vy
Du har syntaxfel i sista satsen, men den är kanske bara fel inskriven i forumet...?Sv:mysql + skapa vy
Unknown table 'v_test'
Har följande tabeller om det blir lättare.
Tabell 1:
CREATE TABLE Larare
(
akronymLarare CHAR(3) PRIMARY KEY,
avdelningsLarare CHAR(3),
namnLarare CHAR(20),
lonLarare INT,
foddLarare DATETIME
);
Tabell 2:
CREATE TABLE Kurs
(
kodKurs CHAR(6) PRIMARY KEY NOT NULL,
namnKurs CHAR(30),
poangKurs FLOAT
);
Tabell 3:
CREATE TABLE Kurstillfälle
(
idKurstillfälle INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
kurstillfälle_kodkurs CHAR(6) NOT NULL,
kurstillfälle_akronymLarare CHAR(10) NOT NULL,
lasperiodKurstillfälle INT NOT NULL
);Sv: mysql + skapa vy
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, <b>v_test,*</b>, FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
Om det bara är så att du har skrivit fel så ska du ju använda
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, <b>v_test.*</b>, FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs; Sv:mysql + skapa vy
Skall hämta från denna vy som heter v_test
CREATE VIEW v_test AS SELECT akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare,
(YEAR(CURDATE())-YEAR(foddLarare))
AS Ålder
FROM Larare ORDER BY foddLarare;
och denna
CREATE VIEW v_Kursen AS
SELECT Kurstillfälle.*, Kurs.* FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
dom funkar varför sig, men om jag vill skapa en ny vy som tar allt från dessa så blir det fel.
Som jag försökte visa med den dåliga koden innan så kommer det bara "Unknown table 'v_test' " Sv: mysql + skapa vy
Om det funkar, prova skapa en ny vy:
"CREATE VIEW test2 AS SELECT * FROM v_test"
Funkar det också?Sv:mysql + skapa vy
Men det är kanske lättare om jag visar det från början, har följande select-sats
SELECT * FROM Kurs, Kurstillfälle WHERE idKurstillfälle;
och skapade en vy av denna, som ser ut så här
CREATE VIEW v_Kursen AS
SELECT Kurstillfälle.*, Kurs.* FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
SELECT * FROM v_Kursen;
och sedan har jag en vy som är denna
CREATE VIEW v_test AS SELECT akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare,
(YEAR(CURDATE())-YEAR(foddLarare))
AS Ålder
FROM Larare ORDER BY foddLarare;
problemet är att jag vill ha dessa två till en enda vy, som plockar fram allt från dessa .
hoppas att jag inte har "snurrat" förmycket med svaret.Sv:mysql + skapa vy
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, <b>v_test.*</b> FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
Du kan i stället pröva
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, <b>v_test.*</b>
FROM
v_test,
Kurs INNER JOIN Kurstillfälle
ON Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs
;
Sv: mysql + skapa vy
SELECT DISTINCT * FROM Kurs, Kurstillfälle, v_Ålder WHERE idKurstillfälle;
så får jag fram allt, men jag får dubbletter och kurstillfälle_akronymlarare stämmer inte överens med namnLarare.
Varför?
Annars är det den som jag vill skapa en vy av.Sv:mysql + skapa vy
TACK DET FUNKAR, nu skall jag bara läsa på lite mera om detta.
Funkar som sagt.Sv: mysql + skapa vy
Men det stämmer inte riktigt med kurstillfälle _akronymlarare och akronymlarare.
se nedan
idKurstillfälle, , kurstillfälle_akronymLarare, , akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare, Ålder
1, 'MOS', 'CHJ', 'APS', 'Conny', 20000, '1943-01-07 00:00:00', 65
3, 'CJH', 'CHJ', 'APS', 'Conny', 20000, '1943-01-07 00:00:00', 65
2, 'MOS', 'CHJ', 'APS', 'Conny', 20000, '1943-01-07 00:00:00', 65
4, 'MOS', 'CHJ', 'APS', 'Conny', 20000, '1943-01-07 00:00:00', 65
6, 'BBE', 'CHJ', 'APS', 'Conny', 20000, '1943-01-07 00:00:00', 65
2, 'MOS', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
4, 'MOS', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
6, 'BBE', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
1, 'MOS', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
3, 'CJH', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
5, 'MOL', 'BHR', 'AIS', 'Birgitta', 15000, '1964-02-07 00:00:00', 44
2, 'MOS', 'ACA', 'APS', 'Anders', 18000, '1967-09-07 00:00:00', 41
4, 'MOS', 'ACA', 'APS', 'Anders', 18000, '1967-09-07 00:00:00', 41
6, 'BBE', 'ACA', 'APS', 'Anders', 18000, '1967-09-07 00:00:00', 41
bara ett kort utdrag, men hur löser jag detta. kolla tabellerna innan Sv:mysql + skapa vy
Sv: mysql + skapa vy
Som du ser så är det inte så just nu, mottager all hjälp.Sv: mysql + skapa vy
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, v_test.*
FROM
v_test
INNER JOIN Kurstillfälle
ON v_test.akronymLarare = Kurstillfälle.kurstillfälle_akronymLarare
INNER JOIN Kurs
ON Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs
;
Sv:mysql + skapa vy
så här ser min insert ut
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'DV1106', 'MOS', 1);
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'DV1106', 'MOS', 4);
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'DV1219', 'CJH', 2);
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'DV1106', 'MOS', 3);
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'PA1106', 'MOL', 1);
INSERT INTO Kurstillfälle VALUES(idKurstillfälle, 'PA1106', 'BBE', 2);
och nu får jag inget värde från DV1219
så här ser det ut när jag kör denna för sig själv
idKurstillfälle, kurstillfälle_kodkurs, kurstillfälle_akronymLarare, lasperiodKurstillfälle
1, 'DV1106', 'MOS', 1
2, 'DV1106', 'MOS', 4
3, 'DV1219', 'CJH', 2
4, 'DV1106', 'MOS', 3
5, 'PA1106', 'MOL', 1
6, 'PA1106', 'BBE', 2
Så här blir det när jag kör vy:n som ovan
idKurstillfälle, kurstillfälle_kodkurs, kurstillfälle_akronymLarare, lasperiodKurstillfälle, kodKurs, namnKurs, poangKurs, akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare, Ålder
1, 'DV1106', 'MOS', 1, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
4, 'DV1106', 'MOS', 3, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
2, 'DV1106', 'MOS', 4, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
6, 'PA1106', 'BBE', 2, 'PA1106', 'Indivuellt projekt', 7.5, 'BBE', 'APS', 'Betty', 16500, '1968-07-07 00:00:00', 40
5, 'PA1106', 'MOL', 1, 'PA1106', 'Indivuellt projekt', 7.5, 'MOL', 'AIS', 'Mats-Ola', 20680, '1978-12-07 00:00:00', 30
Vad gör jag ?Sv: mysql + skapa vy
CREATE VIEW v_Kursen AS
SELECT Kurstillfälle.*, Kurs.* FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
SELECT * FROM v_Kursen;
idKurstillfälle, kurstillfälle_kodkurs, kurstillfälle_akronymLarare, lasperiodKurstillfälle, kodKurs, namnKurs, poangKurs
1, 'DV1106', 'MOS', 1, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5
2, 'DV1106', 'MOS', 4, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5
3, 'DV1219', 'CJH', 2, 'DV1219', 'Databasteknik', 7.5
4, 'DV1106', 'MOS', 3, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5
5, 'PA1106', 'MOL', 1, 'PA1106', 'Indivuellt projekt', 7.5
6, 'PA1106', 'BBE', 2, 'PA1106', 'Indivuellt projekt', 7.5
hjälp!!
varför får jag bara med 5 rader (utan rad 3) i min utskrift när jag kör vy:n nedan
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, v_test.*
FROM
v_test
INNER JOIN Kurstillfälle
ON v_test.akronymLarare = Kurstillfälle.kurstillfälle_akronymLarare
INNER JOIN Kurs
ON Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs
;
får ju ut allt utom raden med id 3 som ni ser.
Ni som ser vad det kan vara hjälp mig. Sv:mysql + skapa vy
Skriver jag följande :
KOD:
CREATE VIEW v_Larare AS
SELECT Kurstillfälle.*, Kurs.*, v_test.*
FROM
v_test
RIGHT JOIN Kurstillfälle
ON v_test.akronymLarare = Kurstillfälle.kurstillfälle_akronymLarare
LEFT JOIN Kurs
ON Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
SELECT * FROM v_Larare;
Så får jag följande, alltså en del null-värde.
idKurstillfälle, kurstillfälle_kodkurs, kurstillfälle_akronymLarare, lasperiodKurstillfälle, kodKurs, namnKurs, poangKurs, akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare, Ålder
3, 'DV1219', 'CJH', 2, 'DV1219', 'Databasteknik', 7.5, '', '', '', , '',
2, 'DV1106', 'MOS', 4, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
4, 'DV1106', 'MOS', 3, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
1, 'DV1106', 'MOS', 1, 'DV1106', 'Databasteknik och Webbapplikationer', 7.5, 'MOS', 'APS', 'Mikael', 19250, '1968-03-07 00:00:00', 40
6, 'PA1106', 'BBE', 2, 'PA1106', 'Indivuellt projekt', 7.5, 'BBE', 'APS', 'Betty', 16500, '1968-07-07 00:00:00', 40
5, 'PA1106', 'MOL', 1, 'PA1106', 'Indivuellt projekt', 7.5, 'MOL', 'AIS', 'Mats-Ola', 20680, '1978-12-07 00:00:00', 30
min v_test ser ut så här
KOD:
CREATE VIEW v_test AS SELECT akronymLarare, avdelningsLarare, namnLarare, lonLarare, foddLarare,
(YEAR(CURDATE())-YEAR(foddLarare))
AS Ålder
FROM Larare ORDER BY foddLarare;
och
CREATE VIEW v_Kursen AS
SELECT Kurstillfälle.*, Kurs.* FROM Kurs
INNER JOIN Kurstillfälle on Kurstillfälle.kurstillfälle_kodkurs = Kurs.kodKurs;
någon som kan se problemet.Sv: mysql + skapa vy
Om det är tomt, då får du leta upp varför utifrån det v_test beror på osv.; det är viktigt att kunna felsöka databasfrågor och inte speciellt svårt. Om något inte verkar stämma, får man kolla på dess delar. Om alla delarna verkar rätt får man kolla noga på detaljer, och skapa små testdatabaser, osv. Om någon del verkar fel, kör man samma princip på den.
Sen är det så att man i allmänhet vill man inte ha strängar som nycklar. Rent puristiskt är det ok (och till och med uppmuntrat), men i praktiken är det ofta lite jobbigare. Jag skulle nog ha ett lärar-ID istället (kanske personnummer).Sv:mysql + skapa vy
Kör jag varje vy för sig själv så funkar dessa och jag får den data som ligger i databasen.
vy:n v_test och v_Kursen funkar som den bör, men kör jag vy:n v_ lararen så får jad de fel som jag beskrivit.
Vet ej hur jag ska lösa detta, eller vad som är fel.Sv: mysql + skapa vy
Har kastat om bokstäverna i min insert för kurstillfälle, och nu funkar vy:n som jag vill utan null-värde.
Men har en liten fråga till, och det är om jag vill plocka ut den lärare som har flest uppdrag som kursansvarig med en SELECT hur skriver jag denna. Sv:mysql + skapa vy
Det finns två sätt att lösa det på.
Det enklaste är
SELECT TOP 1 akronymLarare, COUNT(*) AS C FROM Kurstillfälle GROUP BY akronymLarare ORDER BY C
vilket kan behöva skrivas som ngt i stil med:
SELECT TOP 1 FROM (SELECT akronymLarare, COUNT(*) AS C FROM Kurstillfälle GROUP BY akronymLarare) ORDER BY C
På ett sätt är följande snyggare (eftersom det inte kräver någon speciell ordning) är:
k_per_l = SELECT akronymLarare, COUNT(*) AS C FROM Kurstillfälle GROUP BY akronymLarare
max_k = SELECT MAX(C) FROM k_per_l
max_l = SELECT akronymLarare FROM k_per_l WHERE c = max_kSv: mysql + skapa vy
om jag skriver denna så här:
SELECT TOP 1 FROM (SELECT akronymLarare, COUNT(namnLarare)
AS Larare FROM Kurstillfälle GROUP BY akronymLarare) ORDER BY Larare;
Så får jag följande fel:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1 FROM (SELECT akronymLarare, COUNT(namnLarare)
AS Larare FROM Kurstillfälle' at line 1Sv:mysql + skapa vy
SELECT akronymLarare, COUNT(namnLarare) AS Larare
FROM Kurstillfälle
GROUP BY akronymLarare
ORDER BY Larare
LIMIT 1;
Sv:mysql + skapa vy
Anledningen till att min inte funkade var helt enkelt för att det var mysql (jävligt klantigt att inte tänka på det när det står i rubriken), anledningen till att Pers inte funkar är att det inte finns någon kolumn akronymlarare i tabellen, precis som felmeddelandet säger.
Den heter istället kurstillfälle_akronymlarare. Det kan man ju direkt tipsa om; krångla inte till namnen; det är uppenbart att det handlar om kurstillfället, eftersom det ligger i den tabellen. Sv: mysql + skapa vy
men som sagt jag har tagit allt till mig, och när jag bankade pannan ett tag så lästa jag mellan raderna och skrev detta.
SELECT kurstillfälle_akronymLarare, COUNT(namnLarare) AS Uppdrag
FROM v_Larare
GROUP BY kurstillfälle_akronymLarare
ORDER BY Uppdrag DESC;
och det funkar, men hittar inte hur jag sorterar bort de övriga ur tabellen.
kurstillfälle_akronymLarare, Uppdrag
'MOS', 3
'CHJ', 1
'BBE', 1
'MOL', 1
alltså jag försöker att bara få ut den som har flest uppdrag.
Sv:mysql + skapa vy
men skrev till LIMIT 1 som sist i satsen.
Tack allaSv: mysql + skapa vy
Alternativet hade varit att ändra tabellen och istället skriva
SELECT akronymLarare, COUNT(*) AS Uppdrag
FROM v_Larare
GROUP BY akronymLarare
ORDER BY Uppdrag DESC;
Vad "optimal" betyder är ju en smaksak. Min något krångliga lösning ovan (med MAX() och lite annat) har födelen att den fungerar på alla databaser som följer SQL-standarden. LIMIT och TOP är grejer som enskilda databasmotorer implementerar.