regroupe des lignes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : regroupe des lignes

Re: regroupe des lignes

par blof » 01 avr. 2010, 06:24

Bonjour,
<pre>
<?php

// connexion au serveur : mysql_connect()
// selection de la base : mysql_select_db();

$sql = 'SELECT datedeb,datefin,prix FROM la_table';
$result = mysql_query($sql);

list($ancienne_datedeb, $ancienne_datefin, $ancien_prix) = mysql_fetch_array($result);

while ($row = mysql_fetch_array($result))
{
	if($row['datedeb'] == $ancienne_datefin && $row['prix'] == $ancien_prix)
	{
		$ancienne_datefin = $row['datefin'];
	}
	else
	{
		echo $ancienne_datedeb,' au ',$ancienne_datefin,' ==> ',$ancien_prix,"\n";
		list($ancienne_datedeb, $ancienne_datefin, $ancien_prix) = $row;
	}
}

echo $ancienne_datedeb,' au ',$ancienne_datefin,' ==> ',$ancien_prix,"\n";

?>
</pre>

Re: regroupe des lignes

par macgawel » 31 mars 2010, 17:24

Bonjour.

1. Comment sont définies les périodes ?
Est-il nécessaire de garder deux périodes distinctes quand elles vérifient les conditions (prix identique + se suivent) ?
Parce qu'il y a peut-être moyen de solutionner le problème au moment de la création/modification des périodes :roll:

2. Il nous manque des infos sur le fonctionnement/la taille des tables.
Si la mise à jour des périodes est occasionnelle et que la consultation est régulière, tu peux avoir intérêt à créer une table qui regroupe les périodes au moment de la modification...
De même, on ne sais pas si les périodes peuvent se chevaucher et/ou s'il peut y avoir interruption dans les périodes (une période non renseignée, quoi).

3. Pour rester dans ta configuration - et en supposant que les périodes se suivent sans interruption et sans chevauchement - je dirais :
- Récupération des données SQL triées par date de début dans un tableau
- initialisation du prix
- POUR CHAQUE période, SI le prix est le même que la période précédente on prend la nouvelle date de fin
SINON on passe à un nouveau "groupe de périodes"
/* Format du tableau récupérant les données SQL :
$periodes[$i]['début']='30/01/2010';
$periodes[$i]['fin']='06/02/2010';
$periodes[$i]['prix']='300';
*/
// On initialise les variables. $prix_actuel est initialisé à une valeur qu'on est sûr de ne pas retrouver dans le tableau...
$nombre_periodes = count($periodes);
$prix_actuel = NULL;
$groupe = 0;

// On boucle sur le tableau des périodes pour constituer un tableau groupement des périodes en fonction du prix
for ($i = 0, i$i <= $nombre_periodes-1, $i++) {
   if ($periodes[$i]['prix'] == $prix_actuel) {
// La période précédente avait le même prix => il suffit de modifier la date de fin de groupement
      $groupement[$groupe]['fin'] = $periodes[$i]['fin'];
   }
   else {
// Le prix de la précédente période n'était pas le même
// => On change de groupe/on crée un nouvel élément du tableau de groupement
// on lui met les valeurs de la période actuelle
// et on met à jour le prix de référence pour les futures comparaisons
      $groupe++;
      $groupement[$groupe] = $periodes[$i];
      $prix_actuel = $periodes[$i]['prix'];
   }
}

Re: regroupe des lignes

par style bcn » 31 mars 2010, 16:53

pense qu'il faudrait que tu crée un array avec toutes les périodes d'un même tarif
tu boucles plusieurs fois sur ce tableau en comparant une période avec les autres pour un même tarif et tu les combine au fur et à mesure (très lourd)

merci Datesta, c'est ce que je veux mais je ne sais pas comment faire

Aurais tu un debut de code afin de depoussierrer mon probleme ?

Merci d'avance

Re: regroupe des lignes

par datesta » 30 mars 2010, 23:09

Pour ma deuxième requête y'avait pas besoin de faire de left join...j'etais fatigué je pense

Ce que tu demandes est un peu plus chiant

Je pense qu'il faudrait que tu crée un array avec toutes les périodes d'un même tarif
tu boucles plusieurs fois sur ce tableau en comparant une période avec les autres pour un même tarif et tu les combine au fur et à mesure (très lourd)

ou sinon, tu crée une table (on l'appelera periodeTarif) que tu met à jour à chaque insertion dans la table des tarifs.

exemple :
je veux mettre un tarif de 10€ valable du 30-03-2010 au 01-04-2010.

Code : Tout sélectionner

insert into tarif(prix,datedebut,datefin) values(10,30-03-2010,01-04-2010); //comme tu fais actuellement $rqt = select id,dateDebut,dateFin from periodeTarif where prix = 10 and ((datedeb <= 30-03-2010 and 30-03-2010 <= dateFin) OR (datedeb <= 01-04-2010 and 01-04-2010 <= dateFin)); //on verifie s'il y a déjà ce meme tarif dans les même périodes..dans l'autre table. si $rqt renvoie qqchose $dateDebut = minimun($rqt[dateDebut],30-03-2010); $dateFin = maximum($rqt[dateFin],01-04-2010); update periodeTarif set dateDebut=$dateDebut, dateFin=$dateFin where id = $rqt[id] sinon insert into periodeTarif(,prix,dateA,dateB); fsi
ensuite il te suffit de lire directement la table periodeTarif

le principe est là. j'espère que ça pourra t'aider

Re: regroupe des lignes

par style bcn » 30 mars 2010, 12:02

merci a tous.

Le probleme en SQL est que ca ne verifie pas la periode

Le m'explique avec un exemple :

Si j'ai ca :

Du 30-01-2010 au 06-02-2010 ==> 300
Du 10-04-2010 au 01-05-2010 ==> 990
Du 01-05-2010 au 15-05-2010 ==> 300

Ca affiche ca

Du 30-01-2010 au 15-05-2010 ==> 300
Du 10-04-2010 au 01-05-2010 ==> 990

Il peut y a voir des periodes discontinues (prix sont les memes mais periodes differentes)

j'avais penser a une fonction mais comment faire ?

Re: regroupe des lignes

par devlop78 » 30 mars 2010, 02:06

Wa sayampam paya décidémment je suis très en retard avec juste mes Insert, update, limit, ... en même temps (lol) à chaque fois que je voulais faire une requête, j'allais sur pma, je faisais une requête "type", je copiais collais la requête générée par pma et je remplaçais mes valeurs par les variables php (ça marche très bien mais c'est SQL-limité). Heureusement que je vais avoir un module bdd (35h seulement pour php et bdd :evil: ).

Re: regroupe des lignes

par datesta » 30 mars 2010, 00:33

select prix,min(datedeb) as date from test group by prix
union
select prix,max(datefin) as date from test group by prix
order by prix,date
ou
(un peu sux mais ça à l'air d'être bon..et ça retourne qu'une ligne par prix.)
select test.prix,min(table1.datedeb),max(test.datefin) from test as table1 left join test on table1.prix = test.prix group by test.prix
remplace test par ta table

Re: regroupe des lignes

par devlop78 » 29 mars 2010, 20:10

UNION ? Je connais très mal Mysql (ça fait plusieurs années que j'ai pas touché à une bdd lol) mais en php ce serait assez simple (soit tu traites l'info tout le temps, soit tu fais un système de mise à jour).

Re: regroupe des lignes

par stealth35 » 29 mars 2010, 09:44

regroupe des lignes

par style bcn » 29 mars 2010, 06:34

Bonjour à tous,

Voila mon probleme, j'ai une table que voici :

Image

Pour le moment j'arrive a liste chaque row :

Du 30-01-2010 au 06-02-2010 ==> 300
Du 10-04-2010 au 17-04-2010 ==> 990
Du 17-04-2010 au 24-04-2010 ==> 990
...

Mais je souhaite avoir ce resultat :

Du 30-01-2010 au 06-02-2010 ==> 300
Du 10-04-2010 au 01-05-2010 ==> 990
Du 01-05-2010 au 15-05-2010 ==> 1090

Que chaque periode soit regroupée en fonction du prix (si le prix est le même).

L'algorithme est :
tant que la date de début = date de fin de la précédente et que le prix ne change pas, je suis dans une même période de prix.
Pouvez vous m'aider à faire une fonction permettant ceci ?

Merci :)