17. februar 2012 - 18:22Der er
10 kommentarer og 1 løsning
Oprettelse af EVENT i MYSQL - SYNTAX spørgsmål
Hej Alle,
Jeg vil gerne oprette en EVENT i mysql, der sletter data fra en shopping-cart (Tabel hedder 'cart'), hvis data er mere end en time gammel.
Det er så ikke det eneste jeg skal lave i den EVENT. - Jeg skal bruge nogen værdier fra tabellen 'cart', til at opdatere to andre tabeller, sålede at lager beholdningen af varer igen er opdateret, og til sidst så slette emnerne fra cart (Såfremt de er mere end en time gamle)
Det her er hvad jeg har, og det kunne jeg godt tænke mig kunne virke..
delimiter |
CREATE EVENT delete_cart_items ON SCHEDULE EVERY 5 MINUTES COMMENT 'Skal slette emner i cart der er mere end en time gammel' DO BEGIN COMMENT 'Tag de informationer der skal bruges til at opdatere de andre tabeller med' 1) SELECT produkt_id, antal, str FROM cart WHERE added_date >= added_date + 1 hour
COMMENT 'OPDATER så stock i products tabellen med brug af info fra cart' 2) UPDATE products SET stock = stock + cart.antal WHERE produkt_id = cart.produkt_id
COMMENT 'OPDATER så stock i sizes tabellen med brug af info fra cart' 3) UPDATE sizes SET antal = antal + cart.antal WHERE size = cart.str AND product_id = cart.produkt_id
COMMENT 'Og til sidst: Slet de rækker der har været i tabellen i minimum en time' 4) DELETE FROM cart WHERE added_time >= added_time + 1 hour END | delimiter ;
----------------------
Er der en der kan se hvordan dette skrives med den helt korrekte syntax?
Dette er mit forsøg, det kan dog kun tage 1 cart hvert run, og jeg antager at hver cart har et unikt id, som bliver brugt til at slette rækken med:
DELIMITER $$ CREATE EVENT delete_cart_items ON SCHEDULE EVERY 5 MINUTES DO BEGIN -- Declare variables for saving info DECLARE cartID INTEGER; DECLARE cartProductID INTEGER; DECLARE cartAntal INTEGER; DECLARE cartStr INTEGER; -- Assume that added_date is of type TIME -- This Event only handles one cart at a time -- 1000 is handled as 01:00:00 for the TIME-format SELECT id, produkt_id, antal, str INTO cartID, cartProductID, cartAntal, cartStr FROM cart WHERE added_date >= added_date + 10000 LIMIT 1;
-- Update stock in products UPDATE products SET stock = stock + cartAntal WHERE produkt_id = cartProductID;
-- Update stuck in sizes UPDATE sizes SET antal = antal + cartAntal WHERE size = cartStr AND produkt_id = cartProductID;
-- Delete cart DELETE FROM cart WHERE id = cartID; END $$ DELIMITER ;
For at være ærlig, så ville jeg i dette tilfælde lave det som en php-fil som ved hjælp af prepared statements, og batch-query kunne udføre opgaven, og filen ville blive kørt med cron
1) Du skal have rettigheder til MySql-databasen til at lave et CREATE EVENT 2) MySql-databasen skal være sat op til at eksekvere disse events.
Det får du næppe hos et "billigt" webhotel. Men hvis du har din egen (virtuelle) server, kan du naturligvis.
Yderligere undrer jeg mig over at data fjernes - det er der normalt ingen grund til. Tværtimod: det kan være umådelig vigtigt at kunne gå tilbage og se hvad der er sket. Tabel-størrelser betyder ingenting.
Jeg har indsat den EVENT som du skrev, og der sker noget lidt underligt:
Jeg opretter EVENTET via phpmyadmin, og der kommer så en bekræftelse med koden frem som sædvanlig. (CREATE EVENT....etc etc) - SÅ det ser jo fint ud, men når jeg så skriver "SHOW EVENT delete_cart_items" - så kommer der ikke noget frem.
Jeg forsøgte at se i "INFORMATION_SCHEMA", og der var ikke oprettet nogen EVENTS, selvom der kom den sædvanlige bekræftelse frem.
Det undrer mig, hvordan kan det være - Noget bud på det?
Det er ellers helt perfekt, det du har skrevet - Og det var lige præcist det jeg havde i tankerne.
ERIKJACOBSEN: Ja det kan du have ret i - det er nu blot "kurven", der tømmes for at holde lagerbeholdningen up to date såfremt en evt. kunde forlod sitet uden at tømme kurven f.eks.
Der er således ikke lavet noget transaktioner på dette tidspunkt, hvorfor jeg har valgt at tømme kurven til den kunde der valgte at smutte derfra uden at gennemføre et køb - Jeg kan jo så vælge at flytte data over i en tabel der hedder "næsten_gennemførte_handler" lige inden de slettes fra kurven, og se hvor mange der er smuttet uden at gennemføre osv. Men jeg mener at der er mere "rent" i kurven når der kun er aktuelle kunder/varer i lige den tabel.
Hvis jeg er helt ved siden af, modtager jeg meget gerne svar på tiltale, da jeg ikke har været i gamet så længe :-)
Jeg havde vist ikke aktiveret event_scheduler...Men det er den nu :-) Måske I kan se hvordan det kan være jeg får en syntax fejl når jeg så prøver at oprette dette event?
DELIMITER | CREATE EVENT delete_cart ON SCHEDULE EVERY 5 MINUTES DO BEGIN DECLARE cartID INTEGER;
DECLARE cartProductID INTEGER;
DECLARE cartAntal INTEGER;
DECLARE cartStr VARCHAR;
SELECT id, produkt_id, antal, str INTO cartID, cartProductID, cartAntal, cartStr FROM cart WHERE added_date >= added_date +10000 LIMIT 1 ;
UPDATE products SET stock = stock + cartAntal WHERE produkt_id = cartProductID;
UPDATE sizes SET antal = antal + cartAntal WHERE size = cartStr AND product_id = cartProductID;
DELETE FROM cart WHERE id = cartID;
END | DELIMITER;
Jeg får denne fejl i phpmyadmin:
#1064 - 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 '; SELECT id, produkt_id, antal, str INTO cartID, cart' at line 8
Det er jo tæt på nu, så jeg håber I kan hjælpe mig over målstregen :-)
Jeg havde skrevet MINUTES - Det var MINUTE uden s..
Den bliver fint lavet nu, men den udførte dig ikke jobbet. Så jeg prøvede med en simpel event, det blot slettede indholdet i cart hvor id > 1, og den virkede fint.
Så der må være noget hvor variablerne bliver declared?
Denne virkede fint: delimiter | CREATE EVENT delete_cart ON SCHEDULE EVERY 5 MINUTE DO BEGIN DELETE FROM cart WHERE id > 1; END | delimiter ;
OG DENNE VIRKEDE IKKE: (Og det er så den der gerne skulle virke)
DELIMITER | CREATE EVENT delete_cart ON SCHEDULE EVERY 5 MINUTE DO BEGIN
Det er noget med tiden der ikke går som det skal - Hvis jeg erstatter denne linie:
SELECT id, produkt_id, antal, str INTO cartID, cartProductID, cartAntal, cartStr FROM cart WHERE added_date >= added_date + 10000 LIMIT 1 ;
Med denne:
SELECT id, produkt_id, antal, str INTO cartID, cartProductID, cartAntal, cartStr FROM cart WHERE id > 1 LIMIT 1 ;
Så virker det helt perfekt!
added_date er sat til at være TIME i DB.
Når jeg tilføjer produkter i kurv opdaterer jeg added_time med NOW();
Giver det mig en forkert tid ifht at tjekke op med denne sætning: SELECT id, produkt_id, antal, str INTO cartID, cartProductID, cartAntal, cartStr FROM cart WHERE added_date >= added_date + 10000 LIMIT 1;
Det er i hvert fald et eller andet med tiden der ikke matcher.
Nogen inputs til hvordan jeg skal TIME ind i added_time via denne sql i mit script, for at det virker med: added_date >= added_date + 10000 LIMIT 1;
Med hensyn til at fjerne ikke-indløste kurve, så kan det have lidt betydning for analyse af forretningen. Står der mange kurve og roder, kunne det tyde på et problem med betalingen, eller fordi kunder opdager at forsendelse er dyrt, eller man ikke tager de rigtige kort, eller....
Og især: hvis der pludselig er mange flere kurve der roder, er det så pga den ændring der blev lavet i går?
Hvad indeholder en typisk efterladt kurv. Er det specielle varer man ikke alligevel vil betale for.
...du kan fortsætte... er det så det man kalder Data Mining, eller Business Intelligence?
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.