2010-01-02 3 views
2

Je suis coincé avec la requête suivante, qui ne sera pas ordonnée par sa date. Toute aide ou aperçu de ce que je fais de mal sera très apprécié. La requête est censée obtenir une entrée par thread_id, puis afficher le message le plus récent dans le fil, un peu comme avec un post de forum, ce qui est bien. Mais quand j'essaie de classer les résultats du plus récent au plus ancien en utilisant la clause ORDER BY, il semble l'ignorer.requête Mysql ne sera pas ORDER BY date

$query = "SELECT * 
      FROM messages 
      WHERE (thread_id, received) 
      IN (SELECT thread_id, MAX(received) 
       FROM messages 
       WHERE receiver='$user' OR sender='$user' 
        AND is_hidden_receiver!='1' 
       GROUP BY thread_id) 
      ORDER BY received DESC"; 

Cheers, Lea

+2

Cela n'a pas de sens - 'SELECT *' inclut la colonne 'received', qui est requise pour certains db. Donc 'ORDER BY reçu DESC' devrait fonctionner. –

+1

Quel est le type de données actuel du champ 'received'? – Mike

+0

Quelle version de MySQL utilisez-vous et sur quelle plateforme? Superficiellement, en supposant que la colonne 'received' est en fait un type DATE/TIME, il n'y a pas d'excuse pour ne pas fonctionner - autre, peut-être, qu'un bogue dans MySQL. –

Répondre

2

que vous utilisiez la fonction PHP time() pour générer une valeur à insérer dans une colonne INT(11). Je suis un peu mystifié quant à savoir pourquoi ce tri était incorrect. Je mettrai à jour cette réponse si je comprends comment l'expliquer avec concision.

Cette fonctionnalité est intégrée dans MySQL, c'est le type de colonne TIMESTAMP. Vous devriez probablement read up on it a bit more avant d'être satisfait de cette solution. Il a des propriétés intéressantes, selon la façon de définir votre table, une colonne de type TIMESTAMP peut agir soit comme un timestamp de création, soit comme un timestamp de modification.

0

Est-ce le problème qu'il est vraiment pas le tri par « reçu », ou êtes-vous juste des résultats différents devient que vous attendez? Ce pourrait être l'ordre des opérations sur la clause where - je ne suis pas sûr si ET ou OU a la priorité. Peut-être essayer de changer cette situation

receiver='$user' OR sender='$user' AND is_hidden_receiver!='1' 

à selon l'un de ces vous manquent:

(receiver='$user' OR sender='$user') AND is_hidden_receiver!='1' 

receiver='$user' OR (sender='$user' AND is_hidden_receiver!='1') 
+0

Sans les parenthèses est le même que 'receiver = '$ user' OU (expéditeur = '$ user' ET is_hidden_receiver!= '1') ' –

+0

merci, je ne me souviens jamais de ces choses (j'utilise toujours parens lors du mélange ET et OU juste pour être sûr) – Jenni

+1

Je suis d'accord avec le sentiment de bracketing mixte ET et OR termes - et dit autant dans un commentaire - mais ce n'est probablement pas la source du problème. –