2017-09-03 1 views
2

J'ai lutté avec ce problème pendant environ un mois .. A été la recherche et la lecture de nombreux messages, mais ne peut toujours pas comprendre, comment faire ce travail ..MySQL ORDER BY "count (*) et 2 autres paramètres" d'une autre table

en gros: Je suis arrivé 2 tables de base de données et fun_postsfun_post_upvotes et je veux

SELECT * 
FROM fun_posts 
ORDER BY (HOTTEST POSTS(MOST UPVOTED THIS WEEK)) 

Ceci est mon dernier code, qui ne fonctionnera pas

SELECT * 
FROM fun_posts 
ORDER BY (SELECT count(*), image_id, date 
      FROM fun_post_upvotes 
      GROUP BY image_id 
      ORDER BY DATE(date) > (NOW() - INTERVAL 7 DAY) DESC, 
        count(*) DESC, 
        date DESC) 

Si je divise cette ligne en 2 fonctions SELECT différentes, elles fonctionnent. Je peux sélectionner des messages simples et je peux sélectionner le nombre de votes ascendants commandés comme je le veux.

Mais si je les fais en une ligne comme ça, je me l'erreur suivante:

#1241 - Operand should contain 1 column(s)

EDIT NR 1:

fun_posts Table Image fun_post_upvotes Table Image

Problème avec la réponse que j'ai vérifié:

Ici, regardez comment les publications sont classées dans ma fonction select. (Il choisit comme je veux) 10> 134-> 132-> 2-> 13

Image

Et ici avec le code donné (Il sélectionne l'image, mais pas dans cet ordre) 10> 122- > 39-> 8-> 110

Image

+0

Vous devez utiliser/ajouter un 'WHERE' clause et JOIN serait bénéfique. –

+0

@ Fred-ii- Pourquoi? Pouvez-vous s'il vous plaît expliquer? Ensuite, il ne sera pas afficher "posts" qui n'ont pas de votes positifs cette semaine. Et lorsqu'ils sont divisés en 2 SELECTS séparés, ils fonctionnent. – Crelix

Répondre

4

Vous pouvez utiliser une jointure pour faire

SELECT fp.*, fpu.`cnt` 
FROM fun_posts fp 
LEFT JOIN (SELECT image_id, COUNT(*) AS cnt 
     FROM fun_post_upvotes 
     WHERE `date` > (NOW() - INTERVAL 7 day) 
     GROUP BY image_id 
    ) fpu ON (fpu.image_id = fp.id) 
ORDER BY fpu.cnt DESC, fp.`date` DESC, fp.`id` DESC; 

Il sélectionne une liste de fun_post_upvotes regroupés par image_id une d compte le nombre de lignes. Cette liste est renvoyée à la requête principale et correspond (LEFT JOIN) sur fp.id. La requête affichera d'abord l'article avec le plus de mises à jour au cours des 7 derniers jours, que le moins. Si aucun upvotes n'est trouvé, le résultat les renverra toujours, mais en bas dans aucun ordre spécifique.

Vous pouvez modifier la commande par, pour obtenir les articles dans l'ordre que vous aimez.

Voici une sqlfiddle.com

+0

Que signifie "fpu"? L'avez-vous trompé et il devait être "fp"? – Crelix

+0

fpu est le nom sous lequel le résultat de la sous-requête est connu dans la requête. Donc, le nom court pour fun_ports sera 'fp' et le nom abrégé pour la table jointe sera' fpu' (alias le résultat de la requête fun_post_upvotes) – Jeffrey

+0

Désolé, pouvez-vous m'aider s'il vous plaît plus? J'ai vérifié Comme répondu, mais a découvert que cela ne fonctionnera pas comme j'ai besoin. – Crelix