Partage
  • Partager sur Facebook
  • Partager sur Twitter

Travailler avec des tableaux dans Mysql

Sujet résolu
    19 février 2021 à 10:30:01

    Salut ;)

    Je rencontre un problème assez complexe sur un projet avec une base de données mysql. La personne ayant conçue l'architecture a décidé d'utiliser des tableaux dans une table :

    Donc, je vais essayé d'être clair pour expliquer le problème.

    En gros on a une table nommée panier_session (avec en id panier_session_id), dans cette table il y a un tableau d'annonces qui correspond au contenu du panier d'un utilisateur (colonne tab_annonces) ainsi qu'un tableau de booléen (tab_bool_annonces). Dans ce tableau, on a des booléens qui correspondent au fait que le propriétaire de l'annonce accepte ou refuse que son produit soit louer.

    C'est pas très clair donc je vais donné un exemple :

    Imaginons que dans mon panier, j'ai les annonces 1,2,3 (colonne tab_annonces). Si le propriétaire de l'annonce 1 ACCEPTE, le propriétaire de l'annonce 2 REFUSE, et le propriétaire de l'annonce 3 ACCEPTE, alors dans ma colonne tab_bool_annonces j'aurais le tableau suivant : 1,0,1

    Maintenant, je voudrais changer tout ça et mettre mes valeurs dans une autre table, la voici :

    Je pense que ce genre de structure est la meilleure pour une base relationnelle. Ma colonne 'valide' serait de type booleen et ce serait la dedans que je stockerai le fait que le propriétaire accepte ou refuse. On peut aussi voir que du coup, il y a plusieurs entrées pour un seul et même panier (panier_session_id).

    Ma question est donc la suivante, comment puis-je procéder pour 'migrer' mes valeurs du tableau 'tab_bool_annonces' vers ma colonne dans ma nouvelle table.

    Je sais pas si je suis très clair donc hésitez pas à me poser des questions :).

    Passez une bonne journée ;)

    -
    Edité par PierreBarrere1 19 février 2021 à 10:30:53

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2021 à 10:57:09

      Bonjour,

      Hélas MySQL ne propose pas de fonction string split, ce qui impose de faire le truc en deux étapes, dont une, par simplicité, passera par un code tiers (PHP par exemple).

      Tout d'abord, lorsque l'on a une relation n,n (ici n annonce pour n panier), pas besoin d'identifiant auto incrémenté dans la table de relation, on met en place une clé primaire composée. Le modèle serait :

      Avec ce modèle, les étapes seraient :

      • Transposition des lignes n'ayant pas plusieurs valeurs, directement en SQL :
      INSERT INTO pannier_annonce ( annonce_id, panier_id, quantite, valide )
      SELECT tab_annonces, panier_session_id, 1, tab_bool_annonces
      FROM panier_session
      WHERE tab_annonces NOT LIKE '%,%';
      • Transposition des lignes ayant plusieurs valeurs, via un code tiers :

      Récupération dans un tableau (array) des lignes avec plusieurs valeurs :

      SELECT tab_annonces, panier_session_id, 1, tab_bool_annonces
      FROM panier_session
      WHERE tab_annonces LIKE '%,%';
      • Pour chaque ligne du tableau, éclater les chaînes annonces et bool (avec un string split) dans deux tableaux
      • Pour chaque ligne ces nouveaux tableaux faire une insertion en base

      Exemple de code PHP :

      <?php
      	// On se connecte à la BDD
      	$bdd = new PDO( ... );
      	// On récupère la liste des paniers
      	$requete = $bdd->query( '
      		SELECT tab_annonces, panier_session_id, 1, tab_bool_annonces
      		FROM panier_session
      		WHERE tab_annonces LIKE "%,%";'
      	);
      	$paniers = $requete->fetchAll();
      	// On prépare la requête INSERT
      	$requete = $bdd->prepare( '
      		INSERT INTO pannier_annonce ( annonce_id, panier_id, quantite, valide )
      		VALUES ( ?, ?, 1, ? );'
      	);
      	// On boucle sur les paniers
      	foreach( $paniers as $panier ) {
      		// On éclate les tableaux
      		$annonces = explode( ',', $panier['tab_annonces'] );
      		$bools = explode( ',', $panier['tab_bool_annonces'] );
      		// On boucle sur les tableaux
      		$nb_annonces = count( $annonces );
      		for( $i = 0 ; $i < $nb_annonces ; $i++ ) {
      			// On insère dans la nouvelle table
      			$requete->execute([
      				$annonces[$i],
      				$panier['panier_session_id'],
      				$bools[$i]
      			]);
      		}
      	}
      ?>

      -
      Edité par Benzouye 19 février 2021 à 10:57:47

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        19 février 2021 à 11:09:16

        Ok merci beaucoup pour ton aide ;).

        La seule différence est que j'ai déja TOUTES les annonces de CHAQUE panier dans la table panier_annonce ce qui fait qu'au lieu d'insert, je vais devoir update chaque entrées mais seulement sur le champs valide.

        En tout cas merci encore.

        • Partager sur Facebook
        • Partager sur Twitter
          19 février 2021 à 12:14:22

          Ok, le principe reste le même mais avec des UPDATE au lieu des INSERT.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          Travailler avec des tableaux dans Mysql

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown