Files
TravelMateAdmin/SQL_REFERENCE.md
Van Leemput Dayron f9690045ea feat: Implement Database Service and ViewModels for Messages and Support Requests
- Added DatabaseService to handle database operations for messages and support requests.
- Created IDatabaseService interface to define the contract for database operations.
- Developed ViewModels for Dashboard, Messages, and Support pages to manage data and commands.
- Implemented XAML views for Dashboard, Messages, and Support, including data binding and UI elements.
- Created SQL script for setting up the database schema and inserting test data.
2026-01-12 18:04:10 +01:00

10 KiB

📊 SQL Queries Reference - TravelMate Admin

Requêtes SQL utiles pour gérer et interroger la base de données.

🔍 Requêtes de Consultation

Messages

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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

-- 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
-- Exemple d'analyse de performance
EXPLAIN SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC;