Hej jeg glemte at sige at dette skal opdateres en gang om dagen, så hvis hjælpen kan blive med en løsning i form af en Stored Procedure, vil det hjælpe mig meget :-) Tak på forhånd. Michael
michaeljuhl og janus - jeg er i faerd med at laere mig selv mysql/php/css og lidt mere. Jeg har fundet det meget laererigt at studere de spoergsmaal der kommer her paa eksperten, proeve at finde svar, og hvis det ikke lykkes saa at studere de svar der kommer.
Jeg var igang med at kikke paa dette spoergsmaal og gik ud fra at det skulle loeses ved hjaelp af et sub-query - saasom "update table set truefalse = true where id = 2 and name IN (select name from tabel where where id = 1 and truefalse = true)" men det kunne jeg ikke faa til at virke (jeg arbejder i phpmyadmin gennem one.com), heller ikke hvis jeg bruger tabel t og tabel t1. Google synes at mene at mysql ikke tillader at bruge samme tabel i subquery som den tabel man vil update.
Mens jeg saa arbejdede med en "workarouond" (som jeg giver nedenfor) kom janus med sit meget enklere svar. Det finder jeg interessant. Men jeg kan ikke faa det til at virke. Hvis jeg skriver det i phpmyadmin faar jeg en fejlmelding at der er syntax fejl near "from Tabel t..." Det synes som om min version af mysql ikke vil acceptere konstruktionen "set truefalse = t.truefalse from ...."
Janus, du siger at din kode er "skrevet lige ud af hovedet." Er der en syntax fejl smutted ind i skyndingen eller virker det noejagtigt som skrevet og det burde kunne virke hos mig ogsaa? I saafald, er der et triks jeg har overset saasom at skulle skifte delimiter:
Janus, det er egenligt et nyt spoergsmaal, men jeg var bange for at sammenhaengen ville gaa tabt hvis jeg stillede det som et nyt spoergsmaal, men hvis du kan give mig et svar vil jeg lave en "Points til Janus" med 60 points.
Det jeg selv fandt frem til var at "snyde" mysql ved at lave en ny tabel der er en kopi af de raekker i den oprindelige tabel hvor id = 1 og truefalse = true og saa bruge denne tabel i subquery. Jeg fandt frem til en stored procedure som jeg har testet mod en tabel ved navn michaeljuhl som jeg lavede med de ovenstaaende vaerdier. Naar jeg kalder den storede procedure resulterer det i de rigtige updates.
Her er foerst resultatet af SELECT * FROM michaeljuhl id name truefalse 1 01 1 1 02 0 1 03 1 1 04 1 1 05 0 2 01 0 2 02 0 2 03 0 2 04 0 2 05 0
Her er saa min stored procedure:
CREATE PROCEDURE updatetable() BEGIN CREATE TABLE michaeljuhl1 AS SELECT * FROM michaeljuhl WHERE id=1 AND truefalse = true; UPDATE michaeljuhl SET truefalse = true WHERE id = 2 AND name IN ( SELECT name FROM michaeljuhl1); DROP TABLE michaeljuhl1; END
(delimiter saettes til $ foer prodeduren oprettes og tilbage til ; derefter.)
Efter jeg kalder proceduren med "call updatetable" faar jeg den foelgende tabel hvor truefalse er rettet:
Da jeg engang i et tidligere aarhundrede boede i Danmark var der en der hed Spoergejoergen. Det er der maaske stadigvaek? Og maaske har jeg arvet fra ham (maaske er det ikke for ingenting at jeg hedder Joergen-sen.) Saa, spoergsmaal/kommentarer:
Janus, du siger: "Men jeg sidder og tænker på om I bruger MySQL?" Er det fordi du ikke bruger mysql og det virker fint med hvad du bruger? Jeg bruger mysql, og din kode med subquery stoeder paa det samme problem som mit oprindelige forsoeg: mysql stoetter ikke at man i update laver en subquery paa den samme tabel som den man vil update. Jeg fandt, efter lang soegen, denne udtalelse (i mysql sammenhaeng): "There is one caveat: It is not currently possible to modify a table and select from the same table in a subquery." (Source http://dev.mysql.com/tech-resources/articles/4.1/subqueries.html.) Det skal muligvis vaere lignende mysql begraensninger der goer at jeg ikke kan bruge "update Tabel set truefalse = t.truefalse from Tabel t..." og lignende formuleringer. Saa Janus, Michael, bruger i en SQL forskellig fra mysql og virker det der. (Hvis i bruger mysql og har faaet det til at virke der saa er jeg tilbage til udgangspunktet.)
Janus, saa siger du at min stored procedure maaske ikke virker hvis der skal matches for eksempel til et name og et lastname. Jeg proevede. Jeg lavede en lastname kolonne i tabel michaeljuhl og omskrev den storede procedure til det nedenstaaende og ved at kalde den fik jeg den korrekte update. Her kommer den:
CREATE PROCEDURE updatetable() BEGIN CREATE TABLE michaeljuhl1 AS SELECT * FROM michaeljuhl WHERE id=1 AND truefalse = true; UPDATE michaeljuhl SET truefalse = true WHERE id = 2 AND (name, lastname) IN ( SELECT name, lastname FROM michaeljuhl1); DROP TABLE michaeljuhl1; END
Ja jeg har sjældent arbejdet med MySQL, sidder fortrinsvis med SQL Server fra Microsoft. Jeg ved at der er forskelligheder, men hvilke aner jeg ikke :) Det her var så en af dem!
Den syntax med " (name, lastname) IN ( SELECT name, lastname.." har jeg aldrig set før og kan heller ikke lade sig gøre i MSSQL, forunderligt :) Men godt I fik det hele til at fungere :)
Janus, det kursus jeg havde i sql for adskillige aar tilbage (paa afstandsundervisning ved det hollandske "Open Universiteit") brugte et sql program der hed InterBase (nok fordi det var gratis og mysql ikke bestod endnu). Kurset sagde at i tilfaelde af subselects med en bred noegle var den teoretisk rigtigt loesning den med (name, lastname) IN ... men at InterBase desvaerre ikke kunne. De brugte derfor Oracle for at demonstrere. I Interbase skulle vi bruge "WHERE name || "-" || lastname IN (SELECT name || "-" || lastname FROM ...)". Da jeg fornyligt fandt det gamle kursus frem proevede jeg de forskellige oevelser af i mysql. name || "-" || lastname virker saa tilgaengaeld ikke i mysql (eller jeg har ikke kunnet finde ud af det), her skal man bruge CONCAT(name, "-", lastname).
Jeg sagde at jeg ville give points for din hjaelp selv om jeg broed ind i en anden's spoergsmaal, og du har leveret svaret paa mit problem, at jeg skal vaere opmaerksom paa forskellene mellem de forskellige sql programmer, og jeg fik yderligere udbygget min kendskab. Mogens ogsaa tak fordi du lod mig bryde ind.
No problem, det gør du bare en gang igen hvis du skulle have lyst til det :-)
//Michael
Synes godt om
Ny brugerNybegynder
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.