[SQL] coup de main pour une requête

coup de main pour une requête [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 14-02-2007 à 16:05:02    

Hello! Un bon casse tête! Pour moi du moins...
 
J'ai une table qui contient un 2 colonnes
- un numéro unique
- 3 lettres
 
Tout ceci dans l'ordre alphabétique
 par exemple:
(6, 'afu');
(7, 'aga');
(8, 'ago');
(9, 'aib');
(10, 'aid');
 
but: quelqu'un rentre 3 lettres et on retourne la ligne la plus proche ou celle en question si elle existe
 
J'ai réussi à faire ça:
SELECT numéro, lettres
FROM qqchose
WHERE lettres > lettresdonnées;
 
Puis après je décrémente un coup la ligne. Mais si les 3 lettres y sont plusieurs fois d'affilé, il faut que j'ai la première ligne...
 
Merci aux pro du sql :)

Reply

Marsh Posté le 14-02-2007 à 16:05:02   

Reply

Marsh Posté le 14-02-2007 à 16:13:31    


select id, lettres
from latable
where id =
(
  select max(id)
  from
  (
    select max(id)
    from latable
    where lettres > 'aze'
    union all
    select min(id)
    from latable
    where lettres = 'aze'
  ) tmp1
) tmp2


 
Du bien gore comme il faut à la MagicBuzz :sol:


Message édité par MagicBuzz le 14-02-2007 à 16:13:56
Reply

Marsh Posté le 14-02-2007 à 16:35:10    

Merci pour ta réponse mais un truc:
   
select max(id)  
  from  
  (  
    select max(id)  
 
quésako? tu as répété non?

Reply

Marsh Posté le 14-02-2007 à 17:48:24    

nan, parceque je prends le plus grand des ID parmis :
"le plus grand des ID plus petits que le mot cherche + le plus petit des ID parmis ceux qui sont égaux au mot recherché".
ceci dit, je pense à un truc.
mais béton, ça marche pas mon truc, faut rajouter un niveau et là ça devient trop gore, même pour moi, y'a un cas que j'ai oublié :D
 
à mon avis, le mieux c'est de re-pensé la façon dont est remplie/consultée ta table. parceque là... la plus simple c'est de faire ça en code PHP ou autre si tu ne peux pas modifier la structure de ta base.

Reply

Marsh Posté le 14-02-2007 à 18:56:38    

Euh par ligne la plus proche, tu entend dans l'ordre alphabétique comme dans un dictionnaire ou juste celle qui est après ou avant ?

Reply

Marsh Posté le 15-02-2007 à 00:46:57    

Je ne peux pas modifier la base.
 
J'ai des pages de dictionnaire que je dois afficher, quelqu'un fait une recherche avec 3 lettres.
Si j'ai une ou plusieurs page ou les mots ont ces 3 lettres j'affiche la première.
Sinon j'affiche celle d'avant.
(par exemple je peux avoir une page ou il y a BOM et là page d'après BOO, si on cherche BONJOUR, il se trouve sur BOM, donc je dois afficher celle ci).

Reply

Marsh Posté le 15-02-2007 à 17:30:59    

Ben alors il te reste que la solution gore de MagicBuzz ^^ ! Par contre le cas qu'il ne prend pas en compte, je suppose que c'est si la personne rentre aaa et qu'il n'y a pas de aaa !! En mettant < plutot que > par contre !!
 
Sinon tu dois pouvoir faire ça :
SELECT MIN(id) FROM test
WHERE let =  (SELECT MAX(let) FROM test WHERE let <= 'bbb')
 
Ensuite pour gérer le cas ou l'utilisateur rentre aaa et qu'il n'y a pas de page avant, tu n'as qu'a faire un test sur MIN(id) avec la commande IS_NULL ou NVL de ton SGBD pour remplacer une éventuelle valeur nulle par l'id 1.
 
Du bien gore également ^^ !

Reply

Marsh Posté le 15-02-2007 à 17:49:33    

ouais, en effet je ne gère pas ce cas aussi.
 
non, celui que je ne gère pas, c'est que s'il y a plusieurs pages "abc", alors je retournais la dernière quand on demande "abd" qui n'existe pas.

Reply

Marsh Posté le 16-02-2007 à 15:40:49    

MagicBuzz a écrit :

ouais, en effet je ne gère pas ce cas aussi.
 
non, celui que je ne gère pas, c'est que s'il y a plusieurs pages "abc", alors je retournais la dernière quand on demande "abd" qui n'existe pas.


 
Ah oui c'est vrai !! Cependant, je pense que ce n'est pas un problème d'après ce que j'ai compris de la problématique  de Fused   :)

Reply

Marsh Posté le 16-02-2007 à 23:06:07    

Je l'ai finalement fait en 2 requêtes et je compare les résultats, c'est moins efficace mais ça marche :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed