For dans SQL

pazdu63 7 Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - 19 juin 2017 à 10:22 - Dernière réponse : yg_be 4191 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 18 décembre 2017 Dernière intervention
- 23 juin 2017 à 20:41
Bonjour à tous et à toutes,

Je voudrais savoir si c'est possible de faire une boucle for dans une requête SQL exemple: je veux créer 10 commandes dans ma table commandes en utilisant une boucle for pour pas perdre de temps en faisans ligne par ligne avec un insert into quelqu'un serait-il comment faire svp?

merci de vos réponse :)
Afficher la suite 

7 réponses

Répondre au sujet
Yuh12 186 Messages postés mercredi 7 mai 2014Date d'inscription 28 septembre 2017 Dernière intervention - 19 juin 2017 à 10:58
0
Utile
Bonjour,

Pour 10 lignes de SQL, il vaut mieux ne pas s'embêter et boucler sur la requête pour faire 10 INSERT INTO grâce à un foreach.
Mais pour 5000 lignes par exemple, le fait de faire un seul INSERT INTO avec 5000 VALUES au lieu de 5000 INSERT INTO, est un vrai gain de performance.

Le principe va être d'écrire la requête en PHP, en concaténant les valeurs de la requête SQL.

// On "déclare" le Insert Into sans préciser ses VALUES
$sql_insert = "INSERT INTO `matable` (`id_table`,`col1`, `col2`) VALUES ";
// Pour vérifier si on est sur le dernier élément du tableau
$lastKey = array_pop(array_keys($a_elements)); 	

// On boucle sur le tableau PHP qui renvoit les valeurs
foreach($a_elements as $key=>$elements)
{
	$sql_insert.="("; // Ajout de la parenthèse de debut
	foreach($elements as $key2=>$line)
	{
		if($key2===0){
			$sql_insert.="NULL"; // ID en auto-increment déclaré à NULL pour prendre une valeur automatique
		}
		$sql_insert.=",'".$line."'"; // on remplit toutes les valeurs
	}

	$sql_insert.=")"; // Ajout de la parenthèse de fin
     // On ajoute une virgule si ce n'est pas le dernier element
	if ($key !== $lastKey) {
	    $sql_insert.=",";
	}
}


Et ainsi on obtient un
$sql_insert = "INSERT INTO `matable` (`id_table`,`col1`, `col2`) VALUES ('0','ligne1_col1','ligne1_col2'),
('1','ligne2_col1','ligne2_col2')";


Voici ma méthode, mais je ne suis pas contre un peu de simplification si quelqu'un à une idée :).
Commenter la réponse de Yuh12
pazdu63 7 Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - 19 juin 2017 à 12:08
0
Utile
1
Merci de m'avoir répondu :)

Enfaite je travail sur MySQL et j'ai essayé des commandes et cela me dit toujours la même erreur "Syntax error" je n'arrive pas à comprendre pourquoi
jordane45 19321 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 18 décembre 2017 Dernière intervention - 19 juin 2017 à 12:39
Bonjour,

Tu as testé quoi exactement ?
Quel est le message d'erreur exact et complet ?
Dans quel environnement travailles tu ? Via du code PHP comme le propose Yuh ... ou -
bien directement via l'interface de phpmyadmin ??


Et sinon.. pour répondre à ta question.... connais tu les procédure stockées ?
Car dans une simple requête NON tu ne peux pas faire de boucle... mais via une procédure stockée.. là oui tu peux.
Commenter la réponse de pazdu63
pazdu63 7 Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - 19 juin 2017 à 13:18
0
Utile
J'ai tester ca :
For llx_societe in llx_commande DO
Insert into llx_commande_fournisseur(ref) Values(1)

message d'erreur :
Erreur dans la requête (1064): Syntax error near 'For llx_societe in llx_commande DO Insert into llx_commande_fournisseur(ref) Va' at line 1

Je travaille sur MySQL donc directement via l'interface de phpmyadmin

et non je ne connais pas trop cela je suis un peu débutant sur mySQL
Commenter la réponse de pazdu63
pazdu63 7 Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - Modifié par pazdu63 le 19/06/2017 à 14:46
0
Utile
C'est bon j'ai réussi à faire une boucle mais cela me met une autre erreur que je ne comprends pas voici mon code :
DROP PROCEDURE IF EXISTS jeSuisTest;
DELIMITER |
create procedure jeSuisTest()
BEGIN
DECLARE i INT DEFAULT 0;
je_Suis_Test:loop
INSERT INTO llx_commande_fournisseur(ref) VALUES (10);
SET i := i + 1;
if i=10 then
LEAVE je_Suis_Test;
end if;
end loop je_Suis_Test;
end|

call jeSuisTest()

et voici mon erreur :
Erreur dans la requête (1452): Cannot add or update a child row: a foreign key constraint fails (`mdl_doli`.`llx_commande_fournisseur`, CONSTRAINT `fk_commande_fournisseur_fk_soc` FOREIGN KEY (`fk_soc`) REFERENCES `llx_societe` (`rowid`))

quelqu'un peut m'aider svp?
Commenter la réponse de pazdu63
pazdu63 7 Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - 22 juin 2017 à 09:35
0
Utile
j'ai pu encore avancer et voici mon code : DROP PROCEDURE IF EXISTS jeSuisTest;
DELIMITER |
create procedure jeSuisTest()
BEGIN
DECLARE i INT DEFAULT 0;
je_Suis_Test:loop
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht,multicurrency_total_ht) VALUES (1114,9940,1,2,(subprice*qty),(Select llx_commande.total_ht from llx_commande,llx_commandedet where llx_commandedet.fk_commande=llx_commande.rowid and llx_commande.rowid=1110 and llx_commande.total_ht=(subprice*qty))) ;
SET i := i + 1;
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1115,9941,2,2,(subprice*qty));
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1116,9942,3,2,(subprice*qty));
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1117,9943,4,2,(subprice*qty));
if i=1 then
LEAVE je_Suis_Test;
end if;
end loop je_Suis_Test;
end|

call jeSuisTest();

et j'ai encore une autre erreur que voici : Erreur dans la requête (1093): Table 'llx_commandedet' is specified twice, both as a target for 'INSERT' and as a separate source for data

quelqu'un pourrai-t-il m'aider s'il vous plait? :)
Commenter la réponse de pazdu63
yg_be 4191 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 18 décembre 2017 Dernière intervention - 23 juin 2017 à 20:41
0
Utile
l'erreur est dans la requete ci-dessous:
INSERT INTO llx_commandedet (fk_commande,fk_product,qty,subprice,total_ht,multicurrency_total_ht) VALUES (1114,9940,1,2,(subprice*qty),
(
Select llx_commande.total_ht from llx_commande,llx_commandedet where llx_commandedet.fk_commande=llx_commande.rowid and llx_commande.rowid=1110 and llx_commande.total_ht=(subprice*qty)
)
) ; 

comme tu peux le voir, tu insères dans la table llx_commandedet, et tu utilises cette même table dans le select, comme source de données. et le message t'informe que ce n'est pas autorisé.
Commenter la réponse de yg_be