Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Voilà depuis quelques heures que je suis confronté à un pb.
Je le décris un peu plus:
Je voudrais récupérer une ligne en bdd grace à la fonction mysql MAX().
Je vous mets le code que j'ai écris dans mon model
$select = $this->_db->select(); $select->from($this->_name, array( 'id', 'title', 'subtitle', 'description', 'image', 'MAX(vin_nb_visit)', 'r_reg_id')); return $this->_db->fetchRow($select);
Cette requête ne me renvoie pas la bonne ligne, seul le nb_visit est correct...
Y a t'il une solution à part le faire en 2 fois pour récupérer d'abord le max ensuite le mettre dans une clause where ?
Merci d'avance
Dernière modification par FloK (11-02-2010 23:07:12)
Hors ligne
Il faut mettre un order by sur le MAX et mettre un limit à 1.
Hors ligne
@FloK : hum... qu'est-ce que tu veux faire en SQL ?
Normalement si tu as un MAX, il te faut un GROUP BY pour dire quel maximum tu veux.
A+, Philippe
Hors ligne
@philippe: Je veux récupérer typiquement un fiche du produit le plus visité (le champ nb_visit)
Comment ça pour dire quel maximum je veux ?
Hors ligne
En effet, un order avec un limit 1 marche très bien
Mais si quelqu'un a la solution avec le MAX je la veux bien.
Sinon je passerai la post en résolu
Merci Blount, je n'avais pas pensé a cette solution très simple
Hors ligne
@FloK : a priori MAX ne sert pas à ça, ça permet plutôt de récupérer la valeur maximale d'une liste :
tu as une table avec 3 colones : titre, category, nb_views
si tu veux connaître le nombre max de vues sur un élément classés par catégorie, tu vas faire
SELECT category, MAX(nb_views) FROM my_table GROUP BY category
Dans ton cas, je pense que ta requête renvoie un peu n'importe quoi : le résultat de ton max est bon (le max de la colonne), mais ça ne correspond pas forcément à la ligne renvoyée. La valeur de ton max sera la même dans toutes les lignes renvoyées (essaye dans phpmyadmin, tu verras).
Bref il faudrait faire un truc plus simple du genre
SELECT id, title,..., vin_nb_visit FROM ta_table ORDER BY vin_nb_visit DESC LIMIT 1
A+, Philippe
PS : après je te laisse faire les traductions en Zend_Db_Select
Hors ligne
Une solution avec max, ça serait un truc bizarre du genre :
SELECT id, title,..., vin_nb_visit FROM ta_table WHERE vin_nb_visit = (SELECT MAX(vin_nb_visit) FROM ta_table) LIMIT 1
A+, Philippe
Hors ligne
Ah d'accord j'ai compris à quoi servait le max.
J'avais essayer la méthode avec le select dans le where mais c'était plus compliqué pour pas grand chose.
Finalement le order limit me va très bien
Merci pour l'aide
Hors ligne
Bin oui, je suis un boulet, philippe m'a heureusement corrigé ^^
Tu veux récupérer la ligne de la table avec vin_nb_visit le plus grand de toutes les autres lignes ?
Dans ce cas, le code donné un peu plus haut devrait répondre à ta demande :
philippe a écrit:
SELECT id, title,..., vin_nb_visit
FROM ta_table
ORDER BY vin_nb_visit DESC
LIMIT 1
Ceci trie par ordre décroissant les lignes en triant sur la colonne vin_nb_visit.
Tu vas donc te retrouver avec une liste de ligne avec vin_nb_visit du plus grand au plus petit.
Le LIMIT 1 sert donc à récupérer cette première ligne.
Hors ligne