Aller au contenu

Plusieurs questions à propos d'une requête SQL


Dudu

Sujets conseillés

Salut à tous.

Sur une base MySQL, j'ai une table qui se présente de la manière suivante:

| id | machin | bidule |

"id" est de type int et fonctionne de manière très classique en autoincrement.

"machin" est de type varchar. Il est soit vide, soit il contient un ou plusieurs mots. Mais il est obligatoirement non nul.

"bidule" est de type int. Contrairement à "id" il n'est pas unique et pas en autoincrement.

Maintenant que les présentations sont faites...

Ma première question:

Je cherche à selectionner les lignes ou "machin" n'est pas vide. Mais je ne peux pas utiliser IS NOT NULL puique ce champ n'est jamais nul (et je ne peux pas modifier la base).

J'ai deux types de requêtes qui fonctionnent, mais laquelle vous semble la plus optimisée ?

WHERE `machin` REGEXP '.'

ou

WHERE `machin` != ''

Pour l'instant, la différence de temps affiché par MySQL entre les deux est vraiment minime, mais il faut dire que la table n'est pas très remplie. Sauf qu'à l'avenir elle risque de beaucoup se remplir, donc autant optimiser cela tout de suite.

Ma deuxième question:

| id | machin | bidule |
------------------------
| 1 | | 1 |
| 2 | | 1 |
| 3 | abcdef | 2 |
| 4 | | 2 |
| 5 | | 2 |
| 6 | | 2 |
| 7 | | 3 |
| 8 | ghijkl | 4 |
| 9 | | 4 |

Je voudrais effectuer une requête qui dans l'exemple ci-dessus ne me sorte que

| id | machin | bidule |
------------------------
| 3 | abcdef | 2 |
| 4 | | 2 |
| 5 | | 2 |
| 6 | | 2 |
| 8 | ghijkl | 4 |
| 9 | | 4 |

En fait, ce que je cherche à faire peut se décomposer en plusieurs requêtes:

- trouver les lignes ou "machin" contient un terme

- ensuite selectionner tous les "bidule" qui sont sortis de la première requête, et afficher toutes les lignes où les "bidule" trouvés ont la même valeur (quel que soit "machin").

- et classer le tout par "id" croissant.

Est-ce faisable en une seule requête ? Si oui, auriez-vous une piste ? car j'ai essayé beaucoup de choses en m'aidant de la doc MySQL mais en vain.

D'avance, merci beaucoup :)

Lien vers le commentaire
Partager sur d’autres sites

Après un petit test, ça marche parfaitement: merci beaucoup petit-ourson :)

Euh..

*ahem* ... en fait, à un léger détail près :blush: (c'est de ma faute, je n'avais pas précisé dans mon premier message)

Lorsque j'ai ceci dans ma table

| id | machin | bidule |
------------------------
| 1 | | 24 |
| 2 | | 24 |
| 3 | abcdef | 24 |
| 4 | | 24 |
| 5 | | 24 |

j'aimerais que ça ne me sorte que

| id | machin | bidule |
------------------------
| 3 | abcdef | 24 |
| 4 | | 24 |
| 5 | | 24 |

en fait: prendre à partir de la première occurence de "machin" et afficher tous les "bidule" suivants, sans les précédents.

PS: grâce à ton code, j'ai commencé à me pencher sur les subqueries dans la doc MySQL. Je ne connaissais pas; encore une de ces journées où je me coucherais moins idiot :D

Lien vers le commentaire
Partager sur d’autres sites

Salut Dudu,

Je pense que pour réaliser le dernier point, tu devras le faire avec Php. A ma connaissance, cela me parait difficilement réalisable sauf à trier par la colonne machin, id mais les résultats seront faussés.

Donc, si tu peux, fais une boucle en Php avec la requête de petit-ourson et dès que machin est différent de '' et que bidule est différent du précédent, tu affiches :) (en gros)

Bon courage

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Oui ça me semble compliquer à faire en SQL.

Je ne pense pas que ce soit impossible mais on risque de se retrouver avec une requête super lourde.

Enfin en tout cas, comme cela, à l'heure du thé, je n'ai pas de solutions.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...