JeuWeb - Crée ton jeu par navigateur
comment avoir l'opposé d'un resultat en sql - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : comment avoir l'opposé d'un resultat en sql (/showthread.php?tid=455)

Pages : 1 2


RE: comment avoir l'opposé d'un resultat en sql - pascal - 21-11-2006

je reformule en expliquant un peu:

joshua veut les emplacements libres pour placer des planetes de rayon 5.
ça marche bien, il a tout un ensemble de résultats.

or, si on insere les planetes en DB tel quel, on a des conflits dans les nouvelles planetes, car elles se chevauchent.

la question est:
comment ne pas avoir ce chevauchement?


RE: comment avoir l'opposé d'un resultat en sql - joshua - 21-11-2006

Bon, bonnes nouvelles, j'ai réussi a trouver un contournement. Visiblement le "EXCEPT" n'est pas reconnu.
J'en suis rpesque au bout! une fois terminé, je vous publie la création d'univers dans un tuto.....


RE: comment avoir l'opposé d'un resultat en sql - jean-baptiste - 21-11-2006

Si tu explique ce que tu veu faire il y a toujours un moyen de retrourner le truc et de trouvé un solution sans une requetes soit super compliqué !


RE: comment avoir l'opposé d'un resultat en sql - joshua - 21-11-2006

mais comme le dis mon ami confucius... ah non... pascaltje...
Pourquoi faire plein de php la ou tu peux faier un sql? :p


RE: comment avoir l'opposé d'un resultat en sql - Plume - 21-11-2006

Tu as testé NOT IN ? J'voudrais savoir s'il existe avec MySQL Smile


RE: comment avoir l'opposé d'un resultat en sql - joshua - 22-11-2006

voilà ma réponse... la requête d'insertion des planetes... qui s'en sort avec en tout 800 requetes ^^
Code PHP :
<?php 
/**
* Positionnement des planetes
*/
function position_all_planete_taille()
{
/**
* on purge un éventuel existant.
*/
$contenu="DELETE FROM `tbl_planete_tmp`";
$res = $this->db->query($contenu);
$contenu="DELETE FROM `tbl_planete_tmp2`";
$res = $this->db->query($contenu);

/**
* on va remplir une table avec les planetes non candidates
*/
$contenu="INSERT INTO tbl_planete_tmp2 (x, y) SELECT DISTINCT `x` , `y` FROM `tbl_planete_ref` , `tbl_planete` WHERE `tbl_planete`.`galaxie` = ".$this->galaxie." AND ( `tbl_planete_ref`.`x` - `tbl_planete`.`coordonnee_x` ) * ( `tbl_planete_ref`.`x` - `tbl_planete`.`coordonnee_x` ) + ( `tbl_planete_ref`.`y` - `tbl_planete`.`coordonnee_y` ) * ( `tbl_planete_ref`.`y` - `tbl_planete`.`coordonnee_y` ) <= ( `tbl_planete`.`taille` + ".$this->taille." ) * ( `tbl_planete`.`taille` + ".$this->taille." ) ";
echo
"<br>requete de remplissage de la table TMP<br>".$contenu."<br>";
$res = $this->db->query($contenu);
$this->nb_requete=$this->nb_requete+1;

/**
* on va en déduire les planètes candidates
*/
$contenu="INSERT INTO `tbl_planete_tmp` (coordonnee_x, coordonnee_y) SELECT x, y FROM `tbl_planete_ref` WHERE NOT EXISTS ( SELECT x, y FROM `tbl_planete_tmp2` WHERE tbl_planete_ref.x = tbl_planete_tmp2.x AND tbl_planete_ref.y = tbl_planete_tmp2.y ) AND tbl_planete_ref.x > ".$this->taille." AND tbl_planete_ref.x < (99 - ".$this->taille.") AND tbl_planete_ref.y > ".$this->taille." AND tbl_planete_ref.y < (99 - ".$this->taille.") ";
echo
"<br>requete de remplissage de la table TMP<br>".$contenu."<br>";
$res = $this->db->query($contenu);
$this->nb_requete=$this->nb_requete+1;

/**
* on va prendre la première valeur de la table de manière bouclée et continuer tant qu'il reste des valeurs en table'
*/
$contenu="SELECT coordonnee_x, coordonnee_y FROM tbl_planete_tmp LIMIT 0 , 1";
echo
"requete d'extraction d'une valeur de la table TMP de la table TMP<br>".$contenu."<br>";
$extraction = $this->db->query($contenu);
$this->nb_requete=$this->nb_requete+1;

echo
"la requete a retourné ".$this->db->sql_num_res[$extraction]." resultats<br>";
while (
$this->db->sql_num_res[$extraction] != "0")
{
$table = $this->db->getObject($extraction);
$this->coordonnee_x=$table->coordonnee_x;
$this->coordonnee_y=$table->coordonnee_y;
$this->define_type_planete();
$this->define_peuplade_planete();
$this->insert_planete();
$contenu="DELETE FROM `tbl_planete_tmp` WHERE (`coordonnee_x` - ".$table->coordonnee_x.") * ( `coordonnee_x` - ".$table->coordonnee_x." ) + ( `coordonnee_y` - ".$table->coordonnee_y." ) * ( `coordonnee_y` - ".$table->coordonnee_y." ) <= ( 4* ".$this->taille." * ".$this->taille." ) ";
echo
"requete de purge des valeurs en doublon de la table TMP<br>".$contenu."<br>";
$res = $this->db->query($contenu);
$this->nb_requete=$this->nb_requete+1;
$contenu="SELECT coordonnee_x, coordonnee_y FROM tbl_planete_tmp LIMIT 0 , 1";
echo
"requete d'extraction d'une valeur de la table TMP de la table TMP<br>".$contenu."<br>";
$extraction = $this->db->query($contenu);
echo
"la requete a retourné ".$this->db->sql_num_res[$extraction]." resultats<br>";
$this->nb_requete=$this->nb_requete+1;
}

}

Non je ne suis pas un bourrin.......


RE: comment avoir l'opposé d'un resultat en sql - pascal - 22-11-2006

en regardant le code de ta boucle et en comparant avec le reste de la classe dans un autre sujet, je me dis que:
_ tu peux optimiser la methode insert_planete() en utilisant un id en auto_increment, ce qui fait une requete au lieu de deux
_ tu peux peut être virer un paquet de planetes en collision via une requete en auto jointure, mais je n'ai pas creusé.

Bon courage! :p

A+

Pascal


RE: comment avoir l'opposé d'un resultat en sql - joshua - 22-11-2006

c'est salaud de finir par bon conrage Wink
Pour l'auto-incrément, tu es right :p