Aller au contenu

Plusieurs questions à propos d'une requête SQL


Sujets conseillés

Posté

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 :)

Posté

WHERE `machin` != ''

Cela devrait être plus rapide.

Pour la deuxième requête :

SELECT * FROM taTable WHERE bidule IN (SELECT bidule FROM taTable WHERE machin <> '') ORDER BY id

Voilà ;o)

Posté

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

Posté

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

Posté

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.

Veuillez vous connecter pour commenter

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



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