Select complexe avec différente donnée et limit

Eléphanteau du PHP | 34 Messages

17 mars 2010, 15:05

Salut,

J'ai pas du trop assurer sur le titre... :mrgreen:

Bref, j'ai une table dans laquelle je souhaite récupérer des données.
select * from Ma_Table where type = 0 order by date desc limit 0,4
select * from Ma_Table where type = 1 order by date desc limit 0,3
select * from Ma_Table where type = 2 order by date desc limit 0,6

Peut-on faire un select du style :
select * from Ma_Table (where type = 0 order by date desc limit 0,4) && (where type = 1 order by date desc limit 0,4) && (where type = 2 order by date desc limit 0,4)

Si oui comment et comment récupérer la selection.

Cordialement
Modifié en dernier par Grantome le 17 mars 2010, 15:39, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 mars 2010, 15:34

Avant toute chose, pourquoi ce besoin ? Fonctionnellement, à quoi ça correspondent ces intervalles ?

Eléphanteau du PHP | 34 Messages

17 mars 2010, 15:38

0o On s'en cogne du besoin...

J'ai une table avec des données à récupérer et je souhaite récupérer les 4 dernières donnes de type 0, les 3 dernières de type 1 et les 6 dernières de type 2.
Sachant que les dernières ne sont pas forcément en fin de table. C'est la date qui compte.

J'ai éditer mon post initial pour ajouter l'order

ViPHP
ViPHP | 5462 Messages

17 mars 2010, 15:41

0o On s'en cogne du besoin...
dommage...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 mars 2010, 15:44

0o On s'en cogne du besoin...
Hé, c'est toi qui vient demander de l'aide, donc si des gens prennent le temps de s'attarder sur ton problème tu pourrais avoir l'amabilité de répondre à leurs questions :shock:

Non on "s'en cogne" pas du besoin, très très souvent il y a des gens qui arrivent avec leur idée de solution technique en tête, bien compliquée et qui ne fonctionne pas. Sauf qu'en vérifiant pourquoi ils veulent faire ça, on se rend compte qu'il y a finalement une autre manière de le faire, plus simple et mieux adaptée (genre ici : sql-bases-donnees/trier-bdd-sur-plusieu ... 32649.html)

Mais comme tu sais mieux tout le monde ce qui est important, je propose que tu te démerdes tout seul.

Je trouve ça effarant de venir solliciter des gens pour obtenir de l'aide et de faire ce genre de réponse !!!

Eléphanteau du PHP | 34 Messages

17 mars 2010, 16:03

C'est dingue de toujours tomber sur des gens aussi incompréhensif. :roll:
C'est si difficile de répondre simplement à une question simple ?

Vous me prenez pour un con, vous boudez et rien ne sort de positif du fil. Pourquoi ?
Parce que je demande une aide sur un point précis et on me demande autre chose.

Je sais très bien qu'en discutant pendant 10h sur un problème on va trouver plusieurs solutions. Mais là n'est pas la question.

Oui, je viens demander une aide.
Et oui, j'ai donnée toutes les info.

J'ai 3 requêtes, je veux savoir si on peut en faire qu'une.

Arrêtez donc de monter au créneau pour rien.
"On s'en cogne" n'agresse personne, n'est pas insultant ni rabaissant.

ViPHP
ViPHP | 5462 Messages

17 mars 2010, 16:05


Eléphanteau du PHP | 34 Messages

17 mars 2010, 16:10

... parfois je comprend pourquoi y a des prises de tête sur les forum. :roll:

T'arrives tranquille, t'es poli, tu dis bonjour, t'explique ta venu, tu remercie par avance... et ça part en couille pour rien du tout.

ViPHP
ViPHP | 1024 Messages

17 mars 2010, 16:11

J'ai une idée de solution, mais sans le contexte je pense qu'elle ne servirait à rien, car probablement pas adaptée.

A+

Pascal

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 mars 2010, 16:12

C'est dingue de toujours tomber sur des gens aussi incompréhensif. :roll:
Je rêve...
C'est si difficile de répondre simplement à une question simple ?
Non mais est-ce si grave de chercher à connaître le contexte pour savoir si ce vers tu t'orientes est bien ? Est-ce si difficile pour toi de nous l'expliquer rapidement ?
On pourra toujours par la suite te proposer autre chose ET répondre à la question initiale.
Vous me prenez pour un con, vous boudez et rien ne sort de positif du fil. Pourquoi ?
Arrête un peu, personne ne t'a pris pour un con, personne ne boude (qu'est-ce que je m'en fous au final, c'est toi que tu pénalises !) et rien ne sort de positif parceque tu refuses de répondre aux questions justement !
J'ai 3 requêtes, je veux savoir si on peut en faire qu'une.
Oh ben fusionner des requêtes c'est dans le manuel ça se trouve facilement hein..
Arrêtez donc de monter au créneau pour rien.
"On s'en cogne" n'agresse personne, n'est pas insultant ni rabaissant.
Si un peu quand même, ici c'est pas un support payant, donc quand tu viens demander de l'aide la moindre des choses c'est de te dire que si t'es là c'est que t'y arrives pas tout seul, et que donc les personnes en face ont peut-être des questions pertinentes, et qu'en tout cas ce sont elles qui t'accordent du temps donc tu peux bien prendre le temps de leur répondre sans faire de manières.

Franchement ce genre d'attitude est très décourageant...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 mars 2010, 16:13

... parfois je comprend pourquoi y a des prises de tête sur les forum. :roll:

T'arrives tranquille, t'es poli, tu dis bonjour, t'explique ta venu, tu remercie par avance... et ça part en couille pour rien du tout.
ça part en couille parceque tu m'as envoyé balader alors que je te posais une question sur ton problème, réfléchis un peu et arrête de faire la victime.

Allez, cherche UNION dans le manuel et tag ton sujet en résolu. Merci.

Eléphanteau du PHP | 34 Messages

17 mars 2010, 16:17

OK, on va voir...

J'ai une table d'articles.
Chaque article appartient à un type.
J'ai besoin d'afficher :
- 4 articles du type 0.
- 3 articles du type 1.
- 6 articles du type 3.

Ces articles doivent êtres les derniers en date.

Voilà.
Y a rien à dire de plus et c'est l'explication française du post initial. Je ne vois vraiment pas quoi expliquer en plus.

Eléphanteau du PHP | 34 Messages

17 mars 2010, 17:27

Merci, c'est ce qu'il me fallait.

Et pour finir, je suis désolé que vous ayez pris ma réaction comme un envoi dans les roses, ce n'était pas le but. Simplement de ne pas tourner autour du pot.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mars 2010, 17:50

Maintenant que le sujet est résolu, je me permet un petit HS en tant que modérateur venant de prendre connaissance du sujet.

Grantome, tu viens poser une petite question, en détaillant pas trop mal ton besoin.
Nous, on lit le sujet, on trouve la question bizarre, et on demande plus de détails pour ne pas passer 3h à t'expliquer une réponse qui ne correspond pas à ton besoin. C'est courant dans l'entraide, et ça permet d'éviter de passer 10h sur un problème parce qu'on ne vois pas le pourquoi.

Cette demande t'a semblé étrange, tu as une réaction un peu limite, qui en a entrainé une autre de la part d'ouckileou et vous vous êtes braqués.

Je voudrais rappeler à tous que nous sommes ici sur un forum de bénévoles, qui n'est pas une hotline. Autrement dit, nous ne sommes pas là pour prendre une question en entrée et cracher une réponse en sortie. Les membres qui répondent le font parce que la question les intéresse et qu'ils sont capable d'apporter un minimum d'élément.
Donc :
1/ si, pour vous, un forum, c'est un endroit où on pose un bug, et on remonte une solution, passez votre chemin, ce n'est pas le lieu. Ici, on échange, on discute et on apprend
2/ si une réponse n'apporte rien à la résolution (genre, le "dommage"), passez votre chemin, ça n'apporte rien à la résolution
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Frédéric Brouard - SQLpro
Invité n'ayant pas de compte PHPfrance

21 mars 2010, 15:43

Voici la solution générique et normative :
SELECT ...
FROM
(
select ..., ROW_NUMBER() OVER(order by date) AS N
from   Ma_Table 
where  type = 0 
) AS T1
WHERE N <= 4
UNION ALL
SELECT ...
FROM
(
select ..., ROW_NUMBER() OVER(order by date) AS N
from   Ma_Table 
where  type = 1 
) AS T1
WHERE N <= 3
UNION ALL
SELECT ...
FROM
(
select ..., ROW_NUMBER() OVER(order by date) AS N
from   Ma_Table 
where  type = 2 
) AS T1
WHERE N <= 6
ou ... représente l'ensemble explicite des colonnes à retourner.

Si votre SGBDR n'accepte pas les fonctions de ranking (norme SQL 2003) alors vous pouvez les réaliser autrement. Voir à ce sujet l'article que j'ai écrit ici : http://sqlpro.developpez.com/article/ol ... se-window/

A +
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************