# 📊 SQL Queries Reference - TravelMate Admin RequĂȘtes SQL utiles pour gĂ©rer et interroger la base de donnĂ©es. ## 🔍 RequĂȘtes de Consultation ### Messages ```sql -- Tous les messages SELECT * FROM messages ORDER BY created_at DESC; -- Messages en attente uniquement SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC; -- Messages traitĂ©s uniquement SELECT * FROM messages WHERE done = TRUE ORDER BY created_at DESC; -- Compter les messages par statut SELECT COUNT(*) AS total, SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites FROM messages; -- Messages rĂ©cents (derniĂšres 24h) SELECT * FROM messages WHERE created_at > NOW() - INTERVAL 24 HOUR ORDER BY created_at DESC; -- Messages d'un utilisateur spĂ©cifique SELECT * FROM messages WHERE email = 'jean.dupont@example.com' ORDER BY created_at DESC; -- Recherche dans les messages SELECT * FROM messages WHERE message LIKE '%RGPD%' OR nom LIKE '%Dupont%' ORDER BY created_at DESC; ``` ### Support Requests ```sql -- Toutes les demandes support SELECT * FROM support_requests ORDER BY created_at DESC; -- Demandes en attente SELECT * FROM support_requests WHERE done = FALSE ORDER BY created_at DESC; -- Demandes traitĂ©es SELECT * FROM support_requests WHERE done = TRUE ORDER BY created_at DESC; -- Compter par statut SELECT COUNT(*) AS total, SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites FROM support_requests; -- Demandes d'un compte spĂ©cifique SELECT * FROM support_requests WHERE account_email = 'lucas.petit@example.com' ORDER BY created_at DESC; -- Recherche par email de contact SELECT * FROM support_requests WHERE contact_email = 'lucas.contact@example.com' ORDER BY created_at DESC; ``` ### Statistiques Globales ```sql -- Vue d'ensemble complĂšte SELECT 'Messages' AS type, COUNT(*) AS total, SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites FROM messages UNION ALL SELECT 'Support', COUNT(*), SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END), SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) FROM support_requests; -- ActivitĂ© par jour (7 derniers jours) SELECT DATE(created_at) AS date, COUNT(*) AS messages FROM messages WHERE created_at > NOW() - INTERVAL 7 DAY GROUP BY DATE(created_at) ORDER BY date DESC; -- Volume par heure de la journĂ©e SELECT HOUR(created_at) AS heure, COUNT(*) AS nombre_messages FROM messages GROUP BY HOUR(created_at) ORDER BY heure; ``` ## ✏ RequĂȘtes de Modification ### Changer le Statut ```sql -- Marquer un message comme traitĂ© UPDATE messages SET done = TRUE WHERE id = 1; -- Marquer une demande support comme traitĂ©e UPDATE support_requests SET done = TRUE WHERE id = 1; -- Marquer comme non traitĂ© UPDATE messages SET done = FALSE WHERE id = 1; -- Marquer tous les messages en attente UPDATE messages SET done = FALSE; -- Marquer tous comme traitĂ©s UPDATE messages SET done = TRUE; -- Marquer les vieux messages comme traitĂ©s (plus de 30 jours) UPDATE messages SET done = TRUE WHERE created_at < NOW() - INTERVAL 30 DAY AND done = FALSE; ``` ### Ajouter des DonnĂ©es ```sql -- Nouveau message INSERT INTO messages (nom, prenom, email, message, done, created_at) VALUES ( 'Nouveau', 'Test', 'test@example.com', 'Ceci est un nouveau message de test', FALSE, NOW() ); -- Nouvelle demande support INSERT INTO support_requests (nom, prenom, account_email, contact_email, message, done, created_at) VALUES ( 'Support', 'Test', 'account@example.com', 'contact@example.com', 'ProblĂšme de connexion', FALSE, NOW() ); -- Ajouter plusieurs messages en une fois INSERT INTO messages (nom, prenom, email, message, done, created_at) VALUES ('User1', 'Test', 'user1@test.com', 'Message 1', FALSE, NOW()), ('User2', 'Test', 'user2@test.com', 'Message 2', FALSE, NOW()), ('User3', 'Test', 'user3@test.com', 'Message 3', FALSE, NOW()); ``` ### Supprimer des DonnĂ©es ```sql -- Supprimer un message spĂ©cifique DELETE FROM messages WHERE id = 1; -- Supprimer tous les messages traitĂ©s DELETE FROM messages WHERE done = TRUE; -- Supprimer les vieux messages (plus de 90 jours) DELETE FROM messages WHERE created_at < NOW() - INTERVAL 90 DAY; -- Attention : Supprimer TOUTES les donnĂ©es -- DELETE FROM messages; -- DELETE FROM support_requests; ``` ## 🔧 Maintenance ### Optimisation ```sql -- Analyser les tables ANALYZE TABLE messages; ANALYZE TABLE support_requests; -- Optimiser les tables OPTIMIZE TABLE messages; OPTIMIZE TABLE support_requests; -- VĂ©rifier l'Ă©tat de la table CHECK TABLE messages; CHECK TABLE support_requests; -- RĂ©parer une table (si nĂ©cessaire) REPAIR TABLE messages; ``` ### Index ```sql -- Voir les index existants SHOW INDEX FROM messages; SHOW INDEX FROM support_requests; -- CrĂ©er un index sur l'email (si performance lente) CREATE INDEX idx_messages_email ON messages(email); CREATE INDEX idx_support_account_email ON support_requests(account_email); -- Supprimer un index DROP INDEX idx_messages_email ON messages; ``` ### Backup ```sql -- Exporter les donnĂ©es en SQL (en ligne de commande) -- mysqldump -u root -p travelmateadmin > backup.sql -- Exporter uniquement les messages -- mysqldump -u root -p travelmateadmin messages > messages_backup.sql -- Exporter sans donnĂ©es (structure seulement) -- mysqldump -u root -p --no-data travelmateadmin > structure.sql ``` ## 📊 Rapports et Analytics ### Analyse des Messages ```sql -- Messages les plus frĂ©quents par email SELECT email, COUNT(*) AS nombre_messages, MAX(created_at) AS dernier_message FROM messages GROUP BY email ORDER BY nombre_messages DESC LIMIT 10; -- Temps moyen de traitement SELECT AVG(TIMESTAMPDIFF(HOUR, created_at, NOW())) AS heures_moyennes FROM messages WHERE done = TRUE; -- Messages par mois SELECT DATE_FORMAT(created_at, '%Y-%m') AS mois, COUNT(*) AS nombre FROM messages GROUP BY DATE_FORMAT(created_at, '%Y-%m') ORDER BY mois DESC; -- Taux de complĂ©tion SELECT ROUND(SUM(done) / COUNT(*) * 100, 2) AS taux_completion_pourcent FROM messages; ``` ### Analyse du Support ```sql -- ProblĂšmes les plus frĂ©quents (par mots-clĂ©s) SELECT CASE WHEN message LIKE '%connexion%' THEN 'Connexion' WHEN message LIKE '%mot de passe%' THEN 'Mot de passe' WHEN message LIKE '%synchronisation%' THEN 'Synchronisation' WHEN message LIKE '%facturation%' THEN 'Facturation' ELSE 'Autre' END AS categorie, COUNT(*) AS nombre FROM support_requests GROUP BY categorie ORDER BY nombre DESC; -- Utilisateurs avec plusieurs demandes SELECT account_email, COUNT(*) AS nombre_demandes, SUM(done) AS traitees, COUNT(*) - SUM(done) AS en_attente FROM support_requests GROUP BY account_email HAVING nombre_demandes > 1 ORDER BY nombre_demandes DESC; ``` ## đŸ§Ș Tests et DĂ©veloppement ### GĂ©nĂ©rer des DonnĂ©es de Test ```sql -- GĂ©nĂ©rer 50 messages alĂ©atoires INSERT INTO messages (nom, prenom, email, message, done, created_at) SELECT CONCAT('Nom', n.n), CONCAT('Prenom', n.n), CONCAT('test', n.n, '@example.com'), CONCAT('Message de test numĂ©ro ', n.n), n.n % 3 = 0, -- Un tiers sera "done" NOW() - INTERVAL FLOOR(RAND() * 30) DAY FROM ( SELECT @row := @row + 1 AS n FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t3, (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t4, (SELECT @row := 0) r LIMIT 50 ) n; ``` ### RĂ©initialiser pour les Tests ```sql -- Vider toutes les tables TRUNCATE TABLE messages; TRUNCATE TABLE support_requests; -- RĂ©initialiser les auto-increment ALTER TABLE messages AUTO_INCREMENT = 1; ALTER TABLE support_requests AUTO_INCREMENT = 1; -- RecrĂ©er les donnĂ©es de test SOURCE database_setup.sql; ``` ## 🔐 SĂ©curitĂ© et Utilisateurs ### Gestion des Utilisateurs ```sql -- CrĂ©er un utilisateur pour l'application CREATE USER 'travelmateapp'@'localhost' IDENTIFIED BY 'votre_mot_de_passe'; -- Donner les permissions nĂ©cessaires GRANT SELECT, INSERT, UPDATE ON travelmateadmin.* TO 'travelmateapp'@'localhost'; -- Ne PAS donner DELETE en production pour la sĂ©curitĂ© -- GRANT DELETE ON travelmateadmin.* TO 'travelmateapp'@'localhost'; -- Appliquer les changements FLUSH PRIVILEGES; -- Voir les permissions d'un utilisateur SHOW GRANTS FOR 'travelmateapp'@'localhost'; -- RĂ©voquer une permission REVOKE DELETE ON travelmateadmin.* FROM 'travelmateapp'@'localhost'; -- Supprimer un utilisateur DROP USER 'travelmateapp'@'localhost'; ``` ## 📝 Informations sur la Base ```sql -- Voir toutes les bases de donnĂ©es SHOW DATABASES; -- Utiliser la base TravelMate USE travelmateadmin; -- Voir toutes les tables SHOW TABLES; -- Voir la structure d'une table DESCRIBE messages; DESCRIBE support_requests; -- Voir le CREATE TABLE original SHOW CREATE TABLE messages; -- Taille de la base de donnĂ©es SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.tables WHERE table_schema = 'travelmateadmin'; -- Nombre de lignes par table SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'travelmateadmin'; ``` ## 🚹 DĂ©pannage ```sql -- VĂ©rifier les connexions actives SHOW PROCESSLIST; -- Tuer une connexion bloquĂ©e (remplacer X par l'ID) -- KILL X; -- Voir les variables MySQL SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'wait_timeout'; -- Voir le statut du serveur SHOW STATUS; -- Voir les erreurs rĂ©centes SHOW WARNINGS; SHOW ERRORS; ``` --- ## 💡 Tips - Toujours tester vos requĂȘtes DELETE/UPDATE avec SELECT d'abord - Faites des backups avant toute modification importante - Utilisez LIMIT dans vos requĂȘtes de test - Les index amĂ©liorent les performances SELECT mais ralentissent INSERT/UPDATE - Utilisez EXPLAIN pour analyser les performances des requĂȘtes ```sql -- Exemple d'analyse de performance EXPLAIN SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC; ```