Stergere randuri tabel mysql in functie de alt tabel

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
sterica
Mesaje: 285

Stergere randuri tabel mysql in functie de alt tabel

Salutare,

Exista posibilitatea ca valorile unui tabel sa depinda de valorile unei coloane dintr-un alt tabel?
Si anume:
Am urmatoarele tabele:

Cod: Selectaţi tot

personal
+----+------+-------+
| id | nume | stare |
+----+------+-------+
| 3  | pop  | activ |
+----+------+-------+

table
+----+------+-----+
| id | id_p |nume |
+----+------+-----+
| 1  |  3   | pop |
+----+------+-----+
In tabela personal cand id-ul 3 are stare inactiv, in tabela table sa se stearga liniile aferente id-ului 3 in coloana id_p.

Multumesc!

MarPlo Mesaje: 4343
Salut
Poti sa folosesti acest sql query (sterge randurile din tabel table2 in functie de valoare coloanei 'stare' din tabelul personal):

Cod: Selectaţi tot

DELETE FROM table2 WHERE id_p IN (SELECT id FROM personal WHERE stare ='inactiv')

sterica Mesaje: 285
Acest query banuiesc ca il execut cu ajutorul php-ului, l-as putea face sa ruleze automat la schimbarea valorilor din coloana stare?

MarPlo Mesaje: 4343
Da, acel cod il poti pune sa se execute intr-un script php pe server.
Din ce am vazut pe net, ca sa ruleze automat un cod sql la nivel mysql ar trebui inregistrat acel cod in baza de date cu un "CREATE EVENT". Dar eu nu ma pricep la mysql avansat, cum ar fi rulare automat comenzi si functii sql.
Incearca sa intrebi si pe alte forumuri de specialitate mysql.

sterica Mesaje: 285
Multumesc mult de ajutor, acum stiu in ce directie sa ma informez.

sterica Mesaje: 285
Pentru cei care vor citi topicul, am gasit rezolvarea problemei, defapt am primit-o

Cod: Selectaţi tot

CREATE TRIGGER bfr_upd_activity BEFORE UPDATE ON personal
   FOR EACH ROW
   BEGIN
      if new.stare <> 'inactiv' then 
        delete from my_table where id_p = new.id;
      end if;
   END;
Poate in timp cineva este in masura sa ne ajute cu cateva explicatii, o sa adaug si eu ceea ce banuiesc ca se intampla in codul de mai jos:
In workbench lucrurile stau putin mai explicite:

Cod: Selectaţi tot

// cu aceasta linie de cod banuiesc ca mysql-ul se asigura ca nu mai exista in aceasi baza de date acelasi nume pt trigger
DROP TRIGGER IF EXISTS `my_database`.`bfr_upd_activity`;

DELIMITER $$ // aceasta linie de cod nu stiu ce face, nici cele doua $$

USE `my_databas`$$ // banuiesc ca aceasta linie de cod indica ca se va folosi aceasta baza de date pentru crearea triggerului

// prin CREATE DEFINER - banuiesc ca se oferta acces catre userul care va putea beneifica de trigger
// prin TRIGGER  - cred ca se seteaza numele trigger-ului
// prin BEFORE UPDATE - este tipul actiunii la care sa reactioneze liniile de cod de mai jos
// iar FOR EACH ROW - unde anume sa actioneze codul
CREATE DEFINER=`root`@`localhost` TRIGGER `bfr_upd_activity` BEFORE UPDATE ON `personal` FOR EACH ROW

BEGIN
	if new.stare <> 'inactiv' then // acel new nu stiu ce face
        delete from my_table where id_p = new.id; // la fel si aici nu stiu care rol are acel new
      end if;
END$$
DELIMITER ;

MarPlo Mesaje: 4343
Ca sa nu deviez de la subiectul acestui topic, am creat altul cu explicatii despre DELIMITER $$, folosind ca exemplu codul dat de tine aici.
Vezi pagina de la adresa: //marplo.net/forum/delimiter-mysql-t2644.htm

Subiecte similare