ORDER BY et LIMIT dans le GROUPE PAR
Je vais essayer d'obtenir un sous-ensemble d'enregistrements dans un GROUPE, j'ai vu beaucoup de fou solutions là-bas, mais ils semblent tout simplement trop compliqué, est-il un moyen plus efficace pour ce faire.
SELECT user_id, GROUP_CONCAT(item_id ORDER BY `timestamp`) AS items
FROM wb_user_book_current_item GROUP BY user_id
Afin de me rendre tous les éléments en cours pour tous les utilisateurs, ce qui est correct jusqu'à présent. Mais je veux seulement les dix éléments les plus récents. L'ajout de ORDER BY
à la GROUP_CONCAT
aide, mais ça ne fonctionne toujours pas me donner les dix derniers dossiers.
MODIFIER
Si je fais quelque chose de ce genre et le code de la user_id
alors je peut obtenir les résultats que je veux pour qu'un utilisateur, le problème est de combiner de sorte que je n'ai pas besoin de coder en dur le user_id
et peuvent, par exemple, juste obtenir TOUS utilisateurs dix derniers articles
SELECT GROUP_CONCAT(cp2.item_id) AS items
FROM (SELECT cp.user_id, cp.item_id
FROM wb_user_book_current_item cp
WHERE cp.user_id=1 ORDER BY cp.`timestamp`
LIMIT 10) AS cp2
GROUP BY cp2.user_id
OriginalL'auteur Rob | 2012-10-26
Vous devez vous connecter pour publier un commentaire.
C'est un problème difficile, mais comment à ce sujet:
Cela suppose bien sûr que vous n'aurez pas deux lignes avec le même
timestamp
pour le même utilisateur.Si votre champ timestamp est toujours un entier positif, vous pouvez également remplacer le
NOT EXISTS...OR
avec unCOALESCE
:Réponse originale à cette question, mais apparemment, MySQL ne comprend pas comment le faire correctement et se plaint de celle-ci retourne plusieurs lignes. Bien sûr, nous voulons plusieurs lignes; c'est un
GROUP_CONCAT
. Grr.Malheureusement, je pense qu'il n'y a pas de véritable moyen de contourner en utilisant une sous-requête:
Sinon, l'ajout de
LIMIT
n'importe où d'autre ne soit limiter le nombre de groupes, ou à la limite de l'effectif total de jeu d'enregistrements sur la table (et non pas le groupe) - ce qui n'est pas ce que vous essayez d'atteindre.Ayant des problèmes avec cela, de sorte que le
SELECT
retourne plusieurs lignes comme il se doit, mais leCONCAT
qui se passe après que si je reçois un "plusieurs lignes d'erreur" puisque c'est d'essayer de mettre tout cela en un seul dossier. Encore travaillent à essayer deCONCAT
il d'autres façons, mais juste ne peut pas sembler trouver un moyen encore.Hmm, vous avez raison. Ok essayez cette nouvelle.
OriginalL'auteur lc.
Donc tombé sur une belle solution qui fonctionne assez bien.
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Quelque chose comme mettre tous ensemble:
Donc, fondamentalement, il utilise juste le
num
incrément de limiter le nombre d'enregistrements plutôt que d'utiliserLIMIT
OriginalL'auteur Rob
Essayez ceci:
OriginalL'auteur Mohamed Nuur
Un index sur
(user_id, timestamp, item_id)
aidera efficacité.OriginalL'auteur ypercubeᵀᴹ
Mise à JOUR: je n'ai pas remarqué les GROUP_CONCAT de sorte que vous aurez à utiliser des sous-requêtes dans conunction avec LIMITE
LIMITE d'utilisation
OriginalL'auteur Paul Sullivan