regroupe des lignes

Petit nouveau ! | 3 Messages

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 :)

ViPHP
ViPHP | 5462 Messages

29 mars 2010, 09:44


devlop78
Invité n'ayant pas de compte PHPfrance

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).

Eléphant du PHP | 74 Messages

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

devlop78
Invité n'ayant pas de compte PHPfrance

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: ).

Petit nouveau ! | 3 Messages

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 ?

Eléphant du PHP | 74 Messages

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

Petit nouveau ! | 3 Messages

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

Mammouth du PHP | 672 Messages

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'];
   }
}

Eléphant du PHP | 170 Messages

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>