8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je vous explique mon problème :
Pour une id_association il y a plusieurs id_federation donc j'aimerai regrouper les id_association identique (GROUP BY id_association) à celui que je recherche puis sélectionner les id_federation de cette association.
Pour un id_assocation avoir les id_federation.

Mais pour certain id_association il y plusieurs id_federation identique MAIS qui ont des dates differentes ! Je voudrais donc avoir les id_associations avec les id_federations correspondant qui ont les dates les plus récentes ... voici un échantillon de la table :


ID_association | ID_federation | DATE

1 | 2 |2009/2010
1 | 2 | 2010/2011
1 | 3 | 2009/2010
2 | 4 | 2007/2008

ICI moi je voudrais comme résultats pour l'association 1 :

ID_association | ID_federation | DATE
1 | 2 | 2010/2011
1 |3 | 2009/2010

Je suis un peu perdu Smiley ohwell j'ai essayé cette requête :
SELECT DISTINCT(ID_FEDERATION), DATE FROM TABLE WHERE ID_ASSOCIATION = 1 AND MAX(DATE) = > erreur !
peut être quelque chose comme sa :
SELECT DISTINCT(ID_FEDERATION), DATE FROM TABLE WHERE ID_ASSOCIATION = 1 AND MAX(SELECT TRIM(LEADING DATE) // moins les 5 premiers caractères FROM TABLE)
mais comment faire moins 5 caractères ... j'ai regarder sur developpez.com mais je comprend pas.

Merci d'avance !
Bonne journée Smiley biggrin
Maxi
Modifié par Maxi (29 Jul 2011 - 12:00)
Bonjour à toutes et à tous,
SELECT id_association, id_federation, max(date) as date_max
FROM table
group by id_association, id_federation
order by id_association, id_federation
having date_max > $limite

Tu regroupes les id_association et les id-federation qui sont identiques. En plus, tu les tries dans l'ordre.

Tu ne peux pas faire where max(date) > $limite
Par contre, tu dois l'écrire avec having. Par simplicité, j'ai renommé max(date) en date_max.

Je n'ai pas testé mais l'idée est là !

@+
Modifié par Artemus24 (30 Jul 2011 - 21:13)
Bonjour,

merci de ta réponse,

mais ce que je voudrais c'est récupérer les id_federation pour un id_association choisie au préalable. Sachent que pour un id_association il peut y avoir plusieurs id_federation identique et qu'il faut donc choisir parmi c'est couples id_association - id_federation celui qui à la date la plus récent.

Si j'ai bien compris Ici le having date_max > $limite ne fonctionne pas car je ne veux pas fixer un plafond ...

SELECT ID_ASSO, ID_FEDERATION, MAX( date ) 
FROM table
WHERE ID_ASSO =4


Cette requête marche mais donne une seul ligne, ce qui est normal car elle prend la ligne qui à la date la plus importante mais moi je voudrais qu'elle recherche la date la plus importante non pas au total mais pour chaque couple ID_asso = 4 - ID_federation (variable) . Pour Id_ASSO = 4 et Id_federation donnée recherche la ligne qui à la date la plus récent.

Merci
Maxi
Modifié par Maxi (01 Aug 2011 - 10:16)
Boujour ,
J'ai trouvé !!!! youpi Smiley smile Smiley smile

SELECT ID_ASSO, ID_FEDERATION, MAX(SAISON) FROM (SELECT ID_ASSO, ID_FEDERATION, SAISON
FROM appartient
WHERE id_asso =4) alias group by id_federation   


Peu être que cela aidera une personne de passage.

Merci
Bye
Bonsoir à toutes et à tous,

tu n'es pas obligé de passer par une table temporaire.

Je récapitule ta demande en français pour bien se comprendre.
Tu désires pour un ID_ASSOCIATION donnée, récupérer pour tous les ID_FEDERATION liés, la date la plus récente, ce qui revient au même. La table MySql :

-- phpMyAdmin SQL Dump
-- version 3.3.9
--  http://www.phpmyadmin.net
 
--
-- Serveur: localhost
-- Généré le : Lun 01 Août 2011 à 22:18
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `my_bdd`
--

-- --------------------------------------------------------

--
-- Structure de la table `Tab_assoc`
--
DROP TABLE IF EXISTS `tab_assoc`;

CREATE TABLE IF NOT EXISTS `tab_assoc` (
  `ID_ASSOCIATION` char(10) NOT NULL,
  `ID_FEDERATION` char(10) NOT NULL,
  `ID_COMPTE` int(11) NOT NULL,
  `DATE` date NOT NULL,
  PRIMARY KEY (`ID_ASSOCIATION`,`ID_FEDERATION`,`ID_COMPTE`)
) DEFAULT CHARSET=utf8;

--
-- Contenu de la table `Tab_assoc`
--

INSERT INTO `tab_assoc` (`ID_ASSOCIATION`, `ID_FEDERATION`, `ID_COMPTE`, `DATE`) VALUES
('chasseur', 'alsace', 1, '2011-04-14'),
('chasseur', 'alsace', 2, '2011-05-17'),
('chasseur', 'alsace', 3, '2011-06-25'),
('chasseur', 'alsace', 4, '2011-07-12'),
('chasseur', 'provence', 1, '2011-03-30'),
('chasseur', 'provence', 2, '2011-04-25'),
('chasseur', 'provence', 3, '2011-05-12'),
('chasseur', 'provence', 4, '2011-07-01'),
('pecheur', 'aquitaine', 1, '2011-02-21'),
('pecheur', 'aquitaine', 2, '2011-04-17'),
('pecheur', 'aquitaine', 3, '2011-06-01'),
('pecheur', 'aquitaine', 4, '2011-07-27'),
('pecheur', 'bourgogne', 1, '2011-01-12'),
('pecheur', 'bourgogne', 2, '2011-03-24'),
('pecheur', 'bourgogne', 3, '2011-06-17'),
('pecheur', 'bourgogne', 4, '2011-08-01');



Et voici la requête MySql :

select id_association, id_federation, max(date) as date_max
from `tab_assoc`
where id_association = 'pecheur'
group by id_association, id_federation
order by id_association, id_federation ;


Dans cette exemple, tu obtiens le résultat suivant :

id_association id_federation max_date
chasseur alsace 2011-07-12
chasseur provence 2011-07-01

@+
Modifié par Artemus24 (02 Aug 2011 - 01:13)
Bonjour,

Merci, j'ai testé ta requête et elle marche très bien donc je vais remplacer la mienne qui doit prendre plus de temps à être exécuté. (Dans ton where je pense qu'il faudrait mettre : chasseur vue le résultat, un détail ... ). En tout cas merci cela m'a permis de comprendre le raisonnement et comme il me reste pas mal de requête à faire cela va surement m'aider !

bye
bonne journée !
Bonsoir Maxi,

maintenant que tu le dis, je n'avais pas remarqué le décalage entre la requête SQL et le résultat produit. C'est le problème des copiés / collés et des tests en parallèles.

Bien vu ! Smiley smile

Si tu as d'autres questions du genre, n'hésite pas. Je me ferai un plaisir d'y répondre en faisant un test au préalable.

Bonne continuation. Smiley smile

@+