SELECT une entrée, celle d'avant et celle d'après en 1 fois ? [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 29-04-2008 à 13:48:14
Si t'as que l'id de la photo sélectionnée comme base, j'vois pas trop d'autre solution que :
Code :
|
edit: en fait c'est merdique, voir plus bas.
Marsh Posté le 29-04-2008 à 13:51:41
effectivement j'ai un peu fouillé sur le net mais j'ai trouvé que des histoires avec UNION... je vais me tourner de ce côté donc
J'aurais pensé que MYSQL intègre une fonction de RANGE ou un truc du genre
Merci de l'info !
Marsh Posté le 29-04-2008 à 14:01:34
En fait y a probablement bien mieux :
Code :
|
Marsh Posté le 29-04-2008 à 14:07:28
Ouais enfin y en avait 5 dans ma première proposition.
Marsh Posté le 29-04-2008 à 14:08:13
sielfried a écrit : Ouais enfin y en avait 5 dans ma première proposition. |
spa faux
Marsh Posté le 29-04-2008 à 14:35:37
la première requete marche en mysql? parceque en oracle il me jetterait pour les alias
sinon la 2eme requete devrait etre ok mais il faut changer le AND en OR
Code :
|
Marsh Posté le 29-04-2008 à 14:39:33
Effectivement, étourderie.
D'ailleurs en fait pas besoin de BETWEEN, juste deux OR avec des =.
edit tardif: bon en fait non, ça va pas du tout, t.date n'a aucun sens dans ces conditions.
Marsh Posté le 29-04-2008 à 15:27:32
Le min/max sur les date est une mauvaise idée: s'il y a plusieurs photos pour une date donnée, la requête plus haut peut potentiellement remonter plus de 3 lignes.
Je ferais un truc dans le genre:
Code :
|
note: en plus si les indexes sont correctement réglés celà sera plus rapide
note2: c'est du pur MySQL, ça risque de pas marcher sur autre chose ( en particulier a cause du group by)
Marsh Posté le 29-04-2008 à 16:16:36
Ouais mais il a dit que les IDs étaient pas forcément dans l'ordre je crois. (Enfin en fait non après relecture, c'était ptete pas forcément ce qu'il voulait dire. )
Du coup j'ai supposé que ces "dates" étaient des datetime (auquel cas je pense que mon truc fonctionne).
Marsh Posté le 29-04-2008 à 16:34:06
on peut mettre un min ou un max dans un case en mysql(quasi jamais utilisé)?
en oracle a la limite on pourrait en utilisant les min/max version fonction analytique, mais la il ralerait direct.
Marsh Posté le 29-04-2008 à 16:34:14
darxmurf a écrit : en passant, j'ai essayé de faire une bête requête |
SELECT date, name FROM table ORDER BY date DESC LIMIT 1
edit : en fait ça répond pas a ta question
en fait, il ne sait pas quel name choisir.
Il faudrait faire SELECT date, name FROM table WHERE date=(SELECT max(date) FROM TABLE) je pense
Marsh Posté le 29-04-2008 à 16:34:57
edit: j'ai rien dit mon truc marchera jamais, d'ailleurs celles d'au dessus non plus (faut forcément un join ou un union quelque part)
Marsh Posté le 29-04-2008 à 16:51:46
sielfried a écrit : Ouais mais il a dit que les IDs étaient pas forcément dans l'ordre je crois. |
La requête que j'ai donnée plus haut elle a pas besoin que les IDs se suivent hein
sielfried a écrit : Du coup j'ai supposé que ces "dates" étaient des datetime (auquel cas je pense que mon truc fonctionne). |
Pas vraiment, tu peux très bien avoir plusieurs enregistrement avec exactement le même timestamp dans une table. Ca arrive même régulièrement quand tu as des "insert into taTable ( ..., champs_date) select ... current_timestamp .
sielfried a écrit : edit: j'ai rien dit mon truc marchera jamais, d'ailleurs celles d'au dessus non plus (faut forcément un join ou un union quelque part) |
ça c'est sur
darxmurf a écrit : en passant, j'ai essayé de faire une bête requête |
L'utilisation d'un aggregat (max, min, sum, count, ...) impose l'utilisation du group by sur les colonnes "non-aggrégées". MySQL fait preuve de souplesse la-dessus, mais uniquement jusqu'à un certain point.
casimimir a écrit : on peut mettre un min ou un max dans un case en mysql(quasi jamais utilisé)? |
on peut faire n'importe quoi avec MySQL
mais moi ce qui me surprend le plus c'est qu'il accepte le T2.* dans le select sans qu'il soit dans le group by.
Marsh Posté le 29-04-2008 à 17:12:28
anapajari a écrit : |
Pas dans l'ordre != se suivent pas.
Genre t'ajoute une photo en lui foutant la date d'il y a trois semaines, je sais pas.
C'est assez débile pour une date, mais rien ne l'empêche techniquement (on a plutôt ce genre de cas avec des listes dans lesquelles on peut aller insérer un truc en plein milieu, auquel cas on peut pas se baser sur l'ID).
Marsh Posté le 29-04-2008 à 17:16:06
pas tort
Mais dans ce cas là, au lieu de faire sign(T1.id - T2.id) suffit de faire sign(T1.date - T2.date) et ça marche pareil ...
Marsh Posté le 29-04-2008 à 13:35:39
Hello,
Y a-t-il moyen en un SELECT de récupérer une entrée de ma base ainsi que cette d'avant et celle d'après ?
J'ai une base photos avec :
| ID | NOM | DATE | CATEGORIE |
je veux sélectionner ma photo et avoir sous le coude le nom de celle d'avant et celle d'après, dans la même catégorie
Je voulais éviter de devoir faire trop de requêtes à la suite pour ne sortir que 3 entrées...
Merci
Message édité par darxmurf le 29-04-2008 à 13:38:13
---------------
Des trucs - flickr - Instagram