2009-07-25 8 views
4

J'ai cette requête plutôt complexe qui saisit des données de trois tables, et maintenant je veux que ce soit encore plus compliqué (Oh mon cher)! Je voudrais que la dernière fonctionnalité affichée soit affichée dans sa propre section de la page, et c'est assez facile en sélectionnant la dernière entrée dans le tableau. Cependant, pour la requête complexe (la page principale du site), j'aimerais pouvoir NE PAS afficher cette fonctionnalité.Requête SQL pour sélectionner tout sauf la valeur maximale

Je voudrais union la requête suivante à ma précédente question, mais il ne retourne pas les résultats corrects:

SELECT 
    features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE features.postedOn != MAX(features.postedOn) 
ORDER BY dummy DESC LIMIT 0,15 

Cette requête renvoie l'erreur suivante:

MySQL error: #1111 - Invalid use of group function

Est il y a un moyen de contourner cela?

+0

Pourquoi utiliser features.postedOn AS factice (en supposant que l'on l'appelle mannequin, ne pas l'utiliser) et pas seulement ORDER BY features.postedOn? – Stefan

+0

features.postedOn n'est jamais * utilisé * dans le contexte du site, c'est toujours la chaîne formatée 'posté'. C'est une chaîne fictive pour maintenir l'ordre des différentes entrées, d'où son nom 'dummy' (comme commander par 'posté' retournerait des résultats absurdes). – different

Répondre

5

La requête max doit être dans son propre sous-requête, de sorte que votre SQL final devrait être ::

SELECT features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE 
    features.postedOn != (select max(features.postedOn) from features) 
+1

Vous êtes une star. Je vous remercie. :-) – different

+0

Filtrer sur le champ date n'est probablement pas une bonne idée car il n'est pas garanti d'être unique - il pourrait y avoir deux postes en même temps. le filtrage par id est meilleur. – Guss

+0

Compte tenu de la fréquence d'affichage de mes articles (1 par semaine ou moins) sur mon site, ce sera un non-problème. Merci quand même. :-) – different

0

le problème que vous avez est-ce que vous devez trouver la fonction max (dernière) de la table, tout en passant par chaque ligne, mais MAX() est une fonction de groupe - vous devez regrouper toutes les lignes pour l'utiliser.

vous pouvez utiliser un sous-ensemble pour obtenir l'ID de la dernière fonction:

WHERE featureId <> (SELECT featureId From features ORDER BY postedOn DESC LIMIT1) 

il y a un problème avec cette approche - la sous-requête est exécutée pour chaque ligne, mais il est pas cher.

Questions connexes