2017-10-17 4 views
0

Je suis très nouveau à SQL, et j'utilise MySQL, et j'ai une table qui contient des blogs. Dans cette table, j'ai une colonne nommée "blog_category". J'essaie de renvoyer des valeurs DISTINCT de la catégorie_blog qui apparaissent au moins (n) fois. Exemple:mysql sélectionnez ligne distincte, qui apparaît au moins (n) fois

blog_category 
    ------------- 
    category_1 
    category_1 
    category_2 
    category_3 
    category_3 
    category_4 
    category_4 
    category_1 
    category_1 
    category_2 
    category_2 

Je veux seulement revenir les catégories qui apparaissent dire, au moins 3 fois (supérieure ou égale à 3).

Je peux l'obtenir pour afficher ceux qui apparaissent plus d'une fois avec le mot-clé DISTINCT, mais je veux seulement ceux qui apparaissent réellement plus que le nombre de fois spécifié, dans ce cas seulement ceux qui apparaissent au moins que 3 fois.

Donc, dans ce cas, je veux seulement retourner "category_1" et "category_2".

J'ai essayé de nombreuses façons, mais rien ne semble fonctionner, je continue à obtenir l'erreur suivante:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean 
given in [FILE NAME OMITTED] on line 101 

Voici quelques-unes des choses que j'ai essayé:

$query = "SELECT DISTINCT blog_category 
      FROM blog_posts 
      HAVING COUNT (blog_category) >= 3"; 

$query = "SELECT DISTINCT blog_category 
      FROM blog_posts 
      WHERE blog_category IN 
      (SELECT blog_category 
      HAVING (COUNT (blog_category) >= 3))"; 

$query = "SELECT DISTINCT blog_category 
      FROM blog_posts 
      WHERE blog_category 
      HAVING COUNT(blog_category) >= 3"; 

$query = "SELECT DISTINCT blog_category 
      FROM blog_posts 
      WHERE COUNT(blog_category) >= 3"; 

CI-DESSOUS SONT PROPOSÉS D'AUTRES RÉPONSES UTILISATEURS, QUE JE SUIS ET JUGÉS HAD AVEC NO cHANCE .....

$query = "SELECT blog_category 
      FROM blog_posts 
      GROUP BY blog_category 
      HAVING COUNT(*) >= 3"; 

vOICI TH E COMPLET SECTION DE CODE ÊTRE RAN (I testé sur la partie de test SQL directement du serveur et cela fonctionne très bien, mais quand je lance le code complet réelle, il revient sans cesse que la requête est faux):

$query = "SELECT blog_category 
     FROM blog_posts 
     GROUP BY blog_category 
     HAVING COUNT(*) > 2)"; 

     $result = mysqli_query($conn, $query); 

     if(mysqli_num_rows($result) > 0) { 
      while($row = mysqli_fetch_assoc($result)) { 
       echo "<ul>"; 
       echo "<li>" . $row['blog_category'] . "</p>"; 
       echo "</ul>";   
      } 
     } 
+3

supprimer distinct ajouter 'groupe par blog_Category' après où; avant d'avoir. si non où. – xQbert

+0

Voir https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql- requête – Strawberry

+0

ressemble à l'erreur est liée au code que vous avez écrit après cette requête. Ajoutez le code avec les fonctions mysqli ou ajoutez le code de ce que vous faites avec $ query.Cela semble être le problème réel selon l'erreur que vous avez écrite dans votre question. –

Répondre

5

vous avez besoin GROUP BY:

SELECT blog_category 
FROM blog_posts 
GROUP BY blog_category 
HAVING COUNT(*) >= 3; 

Fondamentalement, vous ne devriez jamais utiliser SELECT DISTINCT avec des fonctions d'agrégation (telles que COUNT(*)). Chaque fois que vous avez des fonctions telles que COUNT(), MIN(), MAX(), et ainsi de suite, vous devez avoir un GROUP BY ou attendre exactement une ligne dans le jeu de résultats.

Certes, il existe des exceptions. Dans certaines bases de données, vous pouvez le faire avec des fonctions analytiques qui n'ont pas d'équivalents d'agrégation. Cela ne s'applique pas à MySQL.

+1

Quelle sortie/erreur vous avez pour la requête ci-dessus? –

+0

Il ne cesse de me dire la requête retournée faux avec erreur: Attention: mysqli_num_rows() s'attend à ce que le paramètre 1 soit mysqli_result, booléen donné dans [FILE NAME OMITTED] sur la ligne 101 –

+0

Ok, donc je l'ai rediffusé sur le ser ver, et cela fonctionne très bien et comme prévu (avec votre réponse à la requête). Mais pour une raison quelconque dans le code, cela ne fonctionne pas. Mais le code revient très bien si je supprime le Group By et le Count ayant. Donc, fondamentalement, les instructions SELECT et FROM fonctionnent très bien dans le code. Je ne comprends pas ce qui ne va pas. –

1

Vous avez bonne idée avec une clause having, mais vous manquez une clause group by pour appliquer le nombre par groupe (c.-à-par valeur distincte de blog_category):

SELECT blog_category 
FROM  blog_posts 
GROUP BY blog_category 
HAVING COUNT(*) >= 3 
+0

@DustinHammack pouvez-vous élaborer ce qui n'a pas fonctionné exactement ici? – Mureinik

+0

J'ai essayé le code exact que vous avez partagé, et j'obtiens la même erreur qu'une fois sur deux, en me disant que la requête est retournée fausse ....L'erreur suivante est l'erreur que je continue à recevoir: Avertissement: mysqli_num_rows() s'attend à ce que le paramètre 1 soit mysqli_result, booléen donné dans [FILE NAME OMITTED] sur la ligne 101 –

0

Comme ceci:

SELECT blog_category 
FROM blog_posts 
GROUP BY blog_category 
HAVING COUNT (blog_category) >= 3 

Vous devez GROUP BY pour savoir comment compter.

+0

Avant de répondre, j'ai dupliqué votre DB dans MS Access et j'ai exécuté le requête sur elle, et il m'a montré avec succès juste cat1 et cat2. Y a-t-il d'autres fonctionnalités dans votre schéma de base de données qui pourraient être pertinentes? Qu'est-ce qu'il a retourné? –

+0

Juste la même erreur à chaque fois, en me disant que la requête retournée faux ... Attention: mysqli_num_rows() attend le paramètre 1 à mysqli_result, booléen donné dans [NOM DU FICHIER OMITTED] sur la ligne 101 –

+1

Je suggère que vous postez votre code avec la requête fournie par les réponses. – isaace