Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/07/2011, 15h06   #1
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Par défaut Mettre certains enregistrement à la fin ?

Bonjour,

J'ai une requête qui me permet d'afficher des articles. Je trie ensuite ça avec un order by sur ma première date. Le problème c'est que certains évènement se déroulent sur un mois, voir plus, donc ils vont rester longtemps en première page.
Je voudrais donc mettre en avant les évènements ponctuels, dotés par exemple du fait que la différence entre les deux dates n'excède pas une semaine.

C'est possible sans passer par un UNION ALL ou un truc trop lourd ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2, a.rubrique
				FROM ARTICLES a
				LEFT JOIN RENSEIGNEMENTS r ON a.id = r.article_id
				LEFT JOIN DATES d ON r.date_id = d.id
				WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
				AND  d.date1 BETWEEN '2011-07-01' AND '2011-07-31'
				AND (
				d.date1 = ( 
					SELECT MIN( d1.date1 ) 
					FROM ARTICLES a1
					LEFT JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
					LEFT JOIN DATES d1 ON r1.date_id = d1.id
					WHERE a1.id = a.id ) 
				)
				GROUP BY a.titre
				ORDER BY d.date1
Merci

EDIT: Désolé mauvais forum
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 15h41   #2
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2, a.rubrique
				FROM ARTICLES a
				LEFT JOIN RENSEIGNEMENTS r ON a.id = r.article_id
				LEFT JOIN DATES d ON r.date_id = d.id
				WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
				AND  d.date1 BETWEEN '2011-07-01' AND '2011-07-31'
				AND (
				d.date1 = ( 
					SELECT MIN( d1.date1 ) 
					FROM ARTICLES a1
					LEFT JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
					LEFT JOIN DATES d1 ON r1.date_id = d1.id
					WHERE a1.id = a.id ) 
				)
				GROUP BY a.titre
				ORDER BY FIELD(d.date1, DATEDIFF(d.date1, d.date2) <= 7, DATEDIFF(d.date1, d.date2) >= 7)
Ca pourrait marcher quelque chose dans ce genre ? J'ai essayé mais le comportement est étrange. Ca marche, mais pas trop
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 10h09   #3
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Bon je me suis rendu à l'évidence...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2, a.rubrique
				FROM ARTICLES a
				LEFT JOIN RENSEIGNEMENTS r ON a.id = r.article_id
				LEFT JOIN DATES d ON r.date_id = d.id
				WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
				AND  d.date1 BETWEEN '2011-07-01' AND '2011-07-31'
                                AND DATEDIFF(d.date2, d.date1) <= 10
				AND (
				d.date1 = ( 
					SELECT MIN( d1.date1 ) 
					FROM ARTICLES a1
					LEFT JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
					LEFT JOIN DATES d1 ON r1.date_id = d1.id
					WHERE a1.id = a.id ) 
				)
				GROUP BY a.titre
				ORDER BY d.date1)
UNION ALL
(SELECT r.article_id, a.titre, a.texte, r.ss_titre, r.lieu_id, d.date1, d.date2, a.rubrique
				FROM ARTICLES a
				LEFT JOIN RENSEIGNEMENTS r ON a.id = r.article_id
				LEFT JOIN DATES d ON r.date_id = d.id
				WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
				AND  d.date1 BETWEEN '2011-07-01' AND '2011-07-31'
                                AND DATEDIFF(d.date2, d.date1) >= 10
				AND (
				d.date1 = ( 
					SELECT MIN( d1.date1 ) 
					FROM ARTICLES a1
					LEFT JOIN RENSEIGNEMENTS r1 ON a1.id = r1.article_id
					LEFT JOIN DATES d1 ON r1.date_id = d1.id
					WHERE a1.id = a.id ) 
				)
				GROUP BY a.titre
				ORDER BY d.date1)
Mais même avec ce code j'ai un problème... Les deux requêtes fonctionnent très bien individuellement mais avec l'UNION ALL elles font n'importe quoi. Non seulement les enregistrement sont mélangés, mais en plus ils sont les mêmes sur chaque page de phpmyadmin !
Et je ne sais pas si c'est pertinent, mais la requête n'est pas colorée comme elle devrait l'être : elle est en grise et tronquée sur la fin

EDIT : Oui en fait je crois qu'il n'arrive pas à placer le LIMIT par défaut, même s'il pense l'avoir fait... Du coup j'ai mes 62 résultats sur chaque page.
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 11h32   #4
Candidat au titre de Membre du Club
 
Homme
Développeur J2EE
Inscription : octobre 2007
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur J2EE

Informations forums :
Inscription : octobre 2007
Messages : 10
Points : 11
Points : 11
  • Le UNION permet de faire un tri sur le résultat global de l'union
  • ta clause WHERE me semble étrange avec un d.date1 BETWEEN ...
    AND (d.date1 = )
    Dans un cas on passe un range et dans le second une valeur unique (modulo le fait qu'il n'y a pas de doublon dans DATES). On ne devrait donc en théorie ne trouver qu'un résultat par select

    date1 & date2 représentent quoi ?
ddoumeche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 11h44   #5
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Citation:
Le UNION permet de faire un tri sur le résultat global de l'union
Oui mais ce n'est pas ce que je veux. Les résultats doivent être triés dans leur propre requête et ensuite assemblés.

Citation:
Dans un cas on passe un range et dans le second une valeur unique (modulo le fait qu'il n'y a pas de doublon dans DATES). On ne devrait donc en théorie ne trouver qu'un résultat par select date1 & date2 représentent quoi ?
Ils représentent la date de début et fin d'un article. Et je le redis, les requêtes fonctionnent bien individuellement. La première me retourne les articles dont la différence entre les deux dates est inférieure à 10, et la seconde requête me retourne ceux dont la différence est supérieure à 10.

En fait je veux éviter que les articles qui se déroulent sur de longues périodes et qui commencent tôt restent trop longtemps en première page lors de l'affichage de ma requête. Donc j'ai pensé à les mettre en fin de requête, c'est tout
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 16h09   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 304
Points : 18 304
Envoyer un message via MSN à CinePhil
Pour commencer, il y a une grosse erreur dans tes requêtes !
Comme tu n'as pas de fonction d'agrégation dans le SELECT, le GROUP BY est inutile et donnera de plus des résultats aléatoires sur toutes les colonnes ne figurant pas dans le GROUP BY.

Si je comprends bien ta requête, tu souhaites obtenir les articles dont la date mini est comprise dans une plage de dates. Cette première requête devrait le faire :
Code :
1
2
3
4
5
SELECT r1.article_id, MIN(d1.date1) AS date_mini
FROM RENSEIGNEMENTS r1
LEFT JOIN DATES d1 ON d1.id = r1.date_id
GROUP BY r1.article_id
HAVING MIN(d1.date1) BETWEEN '2011-07-01' AND '2011-07-31'
Ensuite, tu veux classer ces articles en fonction de la différence entre cette date mini et la date2 et récupérer les autres colonnes d'information :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT r.article_id, d.date1, d.date2,
    CASE
        WHEN DATEDIFF(d.date2, d.date1) <= 10 THEN 1
        ELSE 2
    END AS ordre
FROM ARTICLES a
INNER JOIN
(
    SELECT r1.article_id, MIN(d1.date1) AS date_mini
    FROM RENSEIGNEMENTS r1
    LEFT JOIN DATES d1 ON d1.id = r1.date_id
    GROUP BY r1.article_id
    HAVING MIN(d1.date1) BETWEEN '2011-07-01' AND '2011-07-31'
) tmp ON tmp.article_id = a.id
INNER JOIN RENSEIGNEMENTS r ON r.article_id = a.id
    INNER JOIN DATES d ON d.id = r.date_id
WHERE a.edition IN ('NANCY', 'NANCY-METZ', 'NANCY-METZ-STRASB', 'NANCY-METZ-STR-DIJON', 'TTES EDITIONS')
    AND tmp.date_mini = d.date1
ORDER BY ordre, d.date1
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/07/2011, 16h37   #7
Futur Membre du Club
 
Homme
Étudiant
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 17
Points : 17
Hé bien ça marche, et c'est rapide Tu me sauves d'une petite galère merci

J'ai pas encore le niveau pour penser une requête comme ça... Du coup jamais du Group By sans fonctions d'agrégat ? Pourtant j'ai d'autres requêtes qui dérogent à la règle et il me semble pas qu'elles me sortent n'importe quoi (mais bon j'ai peut être pas fait assez attention)
Shinosha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 16h44   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 020
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 020
Points : 18 304
Points : 18 304
Envoyer un message via MSN à CinePhil
À lire sur le GROUP BY :
http://sqlpro.developpez.com/cours/sqlaz/ensembles/
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h12.


 
 
 
 
Partenaires

Hébergement Web