Avatar billede enkelt-webdesign Nybegynder
17. februar 2012 - 18:22 Der 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?

Mvh, Klemme
Avatar billede Broxigar Praktikant
17. februar 2012 - 23:29 #1
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 ;
Avatar billede Broxigar Praktikant
17. februar 2012 - 23:30 #2
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
Avatar billede erikjacobsen Ekspert
18. februar 2012 - 09:34 #3
...og lige for at præcisere:

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.
Avatar billede enkelt-webdesign Nybegynder
18. februar 2012 - 15:31 #4
Tak for svarerne!

Broxigar:

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 :-)
Avatar billede enkelt-webdesign Nybegynder
18. februar 2012 - 15:58 #5
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 :-)
Avatar billede erikjacobsen Ekspert
18. februar 2012 - 17:37 #6
Skal der en længde på VARCHAR?
Avatar billede enkelt-webdesign Nybegynder
18. februar 2012 - 18:25 #7
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

DECLARE cartID INTEGER;
DECLARE cartProductID INTEGER;
DECLARE cartAntal INTEGER;
DECLARE cartStr VARCHAR(5);

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 kan se under processor at eventen kører, men der bliver ikke udløst ovenstående handlinger.

Jeg synes at de ser helt rigtige ud, så et par friske øjne ville hjælpe!

Bliver de declared med en forkert syntax??
Avatar billede enkelt-webdesign Nybegynder
18. februar 2012 - 20:30 #8
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;

INSERT INTO cart                                    (user_id, produkt_id, navn, vare_type, model, antal, pris, str, added_date)                                    VALUES                                    ('".$user_id."', '".$p_id."', '".$navn."', '".lcfirst($type)."', '".$model_navn."', '1', '".$pris."', '".$str."', NOW())");

Som sagt så er added_time i TIME format.

Skal det evt. være added_time + 3600 (Er det ikke = med en time i UNIX land??)

Nu er fejlen da i det mindste fundet i  mit lille rod..
Avatar billede erikjacobsen Ekspert
18. februar 2012 - 21:00 #9
Du kan vel ikke bruge en TIME, men en DATETIME - ok en TIME kan vist godt blive større end 23:59:59 - men det virker så ... skørt ?

Med et DATETIME kan (...skal...) du bruge funktionen http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_adddate
Avatar billede enkelt-webdesign Nybegynder
19. februar 2012 - 21:40 #10
Lige for at runde den af:

Det virker helt fint nu - Som forslået af Erik, indsatte jeg DATETIME ind i stedet for TIME, og så passede pengene :-)

Tusinde tak for hjælpen og de hurtige svar!! Det var super fedt I lige kunne vejlede og hjælpe mig i mål :-)

God aften, Jan
Avatar billede erikjacobsen Ekspert
19. februar 2012 - 23:19 #11
Herligt!

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?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester