Maison  >  Questions et réponses  >  le corps du texte

Comment convertir et enregistrer des lignes dynamiques en colonnes dynamiques

J'ai une table appelée events où je sauvegarde chaque événement qui se produit sur le site Web. Violon et code que j'ai essayé

+====+==========+=========+===============+=========+=====================+
| id | type     | user_id | website       | data    | created_at          |
+====+==========+=========+===============+=========+=====================+
| 1  | pageview | 1       | example.com   | /       | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 2  | pageview | 2       | example.com   | /path   | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 3  | purchase | 3       | example.com   | 2222    | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 4  | view     | 3       | example.com   | product | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 5  | click    | 3       | example.com   | card    | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 6  | pageview | 4       | site.com      | /       | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 7  | click    | 4       | site.com      | product | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 8  | custom   | 5       | example1.com  | test    | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 9  | custom2  | 6       | google.com    | test    | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+
| 10 | custom3  | 5       | example11.com | test    | 2022-02-16 22:00:00 |
+----+----------+---------+---------------+---------+---------------------+

J'ai un tableau dynamique devant et je veux y avoir des colonnes dynamiques, comme celle-ci.

+==========+=========+==========+=========+=========+=========+=========+=========+
| name     | ...     | event 1  | event 2 | event 3 | event 4 | event 5 | ...     |
+==========+=========+==========+=========+=========+=========+=========+=========+
| test     | ...     | 5        | 50      | 5       | 76      | 23      | ...     |
+----------+---------+----------+---------+---------+---------+---------+---------+
| test2    | ...     | 1        | 78      | 25      | 88      | 54      | ...     |
+----------+---------+----------+---------+---------+---------+---------+---------+

event1event2 ...是来自 events.type est la colonne dynamique de la colonne.

Je recherche la meilleure façon d'organiser et d'agréger les données dans un events tableau.

J'ai écrit la requête pour convertir les lignes en colonnes et afficher les données comme je le souhaite, mais le problème est de sauvegarder ces données agrégées de manière à pouvoir les filtrer plus tard.

Des suggestions sur la façon d'agréger events les données et de les enregistrer dans une autre table afin de pouvoir y exécuter différentes requêtes plus tard ?

Le violon et le code que j'ai essayé

Toute aide serait grandement appréciée.

P粉662614213P粉662614213237 Il y a quelques jours260

répondre à tous(1)je répondrai

  • P粉546138344

    P粉5461383442024-02-26 17:22:01

    En SQL, vous ne pouvez pas créer une table avec des colonnes différentes pour chaque ligne. Il n’existe pas de « colonne dynamique ».

    L'un des faits fondamentaux du fonctionnement des bases de données relationnelles est qu'un tableau a un en-tête qui nomme les colonnes et les types de données, suivi d'un ensemble de lignes où chaque ligne du tableau contient exactement les mêmes colonnes que l'en-tête. Ce tableau.

    La meilleure chose à faire est donc de créer un tableau avec une colonne pour chaque type d'événement, même si ce type d'événement n'est pas disponible pour certains utilisateurs. La valeur de cette colonne peut être NULL, indiquant qu'elle n'est pas pertinente pour cet utilisateur.

    Dans une requête SQL SELECT, vous devez spécifier toutes les colonnes de la requête. Ces colonnes doivent être corrigées dans la requête avant de l'analyser et avant le début de l'exécution. Vous ne pouvez pas créer une requête qui ajoute dynamiquement des colonnes lors de l'examen des données lors de l'exécution de la requête.

    Vous avez donc un type de requête pivot :

    SELECT user_id,
     COUNT(CASE type WHEN 'pageview' THEN 1 END) AS `pageview`,
     COUNT(CASE type WHEN 'purchase' THEN 1 END) AS `purchase`,
     COUNT(CASE type WHEN 'view' THEN 1 END) AS `view`,
     COUNT(CASE type WHEN 'click' THEN 1 END) AS `click`,
     ...more column expressions until you account for all possible types... 
    FROM events
    GROUP BY user_id;

    Avant d'écrire cette requête, vous devez comprendre tous les types d'événements possibles. Vous pouvez utiliser une autre requête pour ce faire :

    SELECT DISTINCT type FROM events;

    répondre
    0
  • Annulerrépondre