MySQL Order avant Group by

J’ai besoin de trouver le dernier message pour chaque auteur et ensuite grouper les résultats donc je n’ai qu’un seul dernier post pour chaque auteur.

SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author ORDER BY wp_posts.post_date DESC 

Ceci regroupe correctement les résultats, je ne reçois donc qu’un article par auteur, mais il ordonne les résultats après les avoir regroupés et non avant qu’ils aient été sélectionnés.

select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc


MODIFIER:

Après quelques commentaires, j’ai décidé d’append des informations supplémentaires.

La société sur laquelle je travaille utilise également Postgres et surtout SQL Server. Ces bases de données ne permettent pas de telles requêtes. Donc, je sais qu’il y a un autre moyen de le faire (j’écris une solution ci-dessous). Vous devez également savoir ce que vous faites si vous ne regroupez pas toutes les colonnes traitées dans la projection ou utilisez des fonctions d’agrégat. Sinon laissez-le être!

J’ai choisi la solution ci-dessus, car c’est une question spécifique. Tom veut obtenir le post récent pour chaque auteur dans un site WordPress. Dans mon esprit, l’parsing est négligeable si un auteur fait plus d’un article par seconde. WordPress devrait même l’interdire par sa détection de courrier indésirable. Je sais par expérience personnelle qu’il ya un avantage très important dans la performance en faisant un groupe aussi sale avec MySQL. Mais si vous savez ce que vous faites, alors vous pouvez le faire! J’ai des groupes aussi sales dans des applications pour lesquelles je suis professionnellement responsable. Ici, j’ai des tables avec quelques lignes mio qui nécessitent 5-15s au lieu de 100 ++ secondes.

Peut être utile sur certains avantages et inconvénients: http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html


 SELECT wp_posts.* FROM wp_posts JOIN ( SELECT g.post_author MAX(g.post_date) AS post_date FROM wp_posts as g WHERE g.post_status='publish' AND g.post_type='post' GROUP BY g.post_author ) as t ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date ORDER BY wp_posts.post_date 

Mais s’il y a plus d’un article par seconde pour un auteur, vous obtiendrez plus d’une ligne et pas la dernière .

Maintenant, vous pouvez tourner la roue à nouveau et obtenir le message avec l’ Id le plus élevé. Même ici, il n’est pas garanti que vous ayez vraiment le dernier.

Je ne sais pas si je comprends votre exigence correcte, mais si vous suivez les instructions internes, vous obtenez la liste des dernières dates de publication pour chaque auteur et les joignez à la table wp_posts pour obtenir un enregistrement complet.

 SELECT * FROM wp_posts wp INNER JOIN ( SELECT post_author , MAX(post_date) AS post_date FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post' GROUP BY post.author ) wpmax ON wpmax.post_author = wp.post_author AND wpmax.post_date = wp.post_date ORDER BY wp.post_date DESC 

Je pense que la réponse de @edze est fausse.

Dans le manuel MySQL, vous pouvez lire:

MySQL étend l’utilisation de GROUP BY afin que la liste de sélection puisse faire référence à des colonnes non agrégées non nommées dans la clause GROUP BY. Vous pouvez utiliser cette fonctionnalité pour obtenir de meilleures performances en évitant le sorting et le regroupement de colonnes inutiles. Toutefois, cela est utile principalement lorsque toutes les valeurs de chaque colonne non agrégée non nommées dans GROUP BY sont les mêmes pour chaque groupe. Le serveur est libre de choisir n’importe quelle valeur de chaque groupe, donc, à moins qu’elles soient identiques, les valeurs choisies sont indéterminées. De plus, la sélection des valeurs de chaque groupe ne peut pas être influencée par l’ajout d’une clause ORDER BY. Le sorting du jeu de résultats se produit après le choix des valeurs et ORDER BY n’affecte pas les valeurs choisies par le serveur.

Deux grandes références:

Désolé, mais je ne peux pas commenter la réponse de @edze à cause de ma réputation, alors j’ai écrit une nouvelle réponse.

Faites un GROUP BY après ORDER BY en encapsulant votre requête avec GROUP BY comme ceci:

 SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.author 

peu importe si vous commandez avant ou après la déclaration de groupe, car la commande signifie seulement que 213 passe à 123 ou 321 et pas plus. group by ne prend que quelques entrées par colonne, pas seulement la dernière. Je considère que vous travaillez avec des sous-critères comme ici

 SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' AND wp_posts.post_date = (Select max(post_date) from wp_posts where author = ... ) 

Que penses-tu de cela?? Semble travailler pour moi

 SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author 

Cela m’amène tous les auteurs avec le post_date le plus à jour … Identifiez-vous un problème là-bas? Je ne

  SELECT wp_posts.*,max(wp_posts.post_date) FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author 

Lorsque notre table est devenue grande, les performances doivent également être vérifiées. J’ai vérifié toutes les options dans les questions ici, avec un système PM avec un message de 136K et une table de liens avec 83K lignes.

Lorsque vous n’avez besoin que de compter, ou uniquement des identifiants – la solution d’Alex est la meilleure.

 SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author 

Lorsque vous avez besoin d’autres champs, je dois modifier la solution Husky110 (à la conception de ma table – ici c’est seulement un exemple – non cochée), cela dans mes tables 10 fois plus rapide que l’option sous-requête:

 SELECT wp_posts.* FROM wp_posts, (Select post_id as pid, max(post_date) maxdate from wp_posts where author = ... group by author order by maxdate desc limit 4) t WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' AND wp_posts.post_id = pid 

Cette modification peut sélectionner plusieurs publications (une pour l’utilisateur, par exemple) et peut être modifiée pour d’autres solutions.

Moshe.

Utilisez le code ci-dessous …

  $bloguser->user_id, 'showposts' => 1, 'caller_get_posts' => 1 ); $my_query = new WP_Query($args); if( $my_query->have_posts() ) { // $user = get_userdata($bloguser->user_id); // echo 'This is one post for author with User ID: ' . $user->ID . ' ' . $user- >user_firstname . ' ' . $user->user_lastname; while ($my_query->have_posts()) : $my_query->the_post(); ?>   by   

ICI une réponse simple de http://www.cafewebmaster.com/mysql-order-sort-group

 SELECT * FROM ( select * from `my_table` order by timestamp desc ) as my_table_tmp GROUP BY catid ORDER BY nid desc 

ça a fait des merveilles pour moi