par
Hubert Roksor » 31 janv. 2008, 15:14
en deux requêtes c'est facilement possible mais le but est aussi de réduire le nombre de requêtes...
Pour des requêtes aussi simples, la différence de performance entre la version à 1 requête et la version à 2 requêtes est négligible. À moins d'effectuer cette opération 10 fois par page, tu ne pourrais même pas le chronométrer.
Ceci dit, voici comment tu peux le faire en une seule requête (MySQL 4.1+)
Code : Tout sélectionner
SELECT contenu FROM table WHERE position = (
SELECT MIN(position) FROM table
)
Attention, cette requête peut renvoyer plusieurs enregistrements, pour peu qu'ils partagent la même valeur pour "position". Ajoute un "LIMIT 1" pour n'en récupérer qu'un seul.
Une requête similaire pour les anciennes versions de MySQL, potentiellement plus rapide.
Dernière chose, si tu t'inquiètes pour tes performances, tu ferais mieux de t'intéresser aux index plutôt, et ajouter un index sur la colonne "position".
HAVING position = MIN(position) -> Unknown column 'position' in 'having clause'
C'est parce que HAVING est l'équivalent d'un WHERE qui agit sur le résultat de ta requête. "position" n'apparaît pas dans ton SELECT, donc c'est comme un WHERE sur une colonne qui n'existe pas.
[quote="supercanard"]en deux requêtes c'est facilement possible mais le but est aussi de réduire le nombre de requêtes...[/quote]
Pour des requêtes aussi simples, la différence de performance entre la version à 1 requête et la version à 2 requêtes est négligible. À moins d'effectuer cette opération 10 fois par page, tu ne pourrais même pas le chronométrer.
Ceci dit, voici comment tu peux le faire en une seule requête (MySQL 4.1+)
[code]SELECT contenu FROM table WHERE position = (
SELECT MIN(position) FROM table
)[/code]
Attention, cette requête peut renvoyer plusieurs enregistrements, pour peu qu'ils partagent la même valeur pour "position". Ajoute un "LIMIT 1" pour n'en récupérer qu'un seul.
Une requête similaire pour les anciennes versions de MySQL, potentiellement plus rapide.
[code]SELECT contenu
FROM table
ORDER BY position
LIMIT 1[/code]
Dernière chose, si tu t'inquiètes pour tes performances, tu ferais mieux de t'intéresser aux index plutôt, et ajouter un index sur la colonne "position".
[quote="supercanard"]HAVING position = MIN(position) -> Unknown column 'position' in 'having clause'[/quote]
C'est parce que HAVING est l'équivalent d'un WHERE qui agit sur le résultat de ta requête. "position" n'apparaît pas dans ton SELECT, donc c'est comme un WHERE sur une colonne qui n'existe pas.