2010-02-07 4 views
3

Si j'ai ceci:Count lignes de résultats d'une « mysql_query »

$results = mysql_query("SELECT * FROM table_name WHERE id=$id"); 

est-il donc un moyen de vérifier le nombre de lignes qui ont une valeur de champ de « privé » ou « Société »?

Je dois montrer à l'utilisateur combien d'enregistrements "Privé" et "Entreprise" ont été trouvés, sans faire d'autre requête. (Il y a une colonne appelée 'ad_type' qui contient soit "private" soit "company")

Je connais déjà mysql_num_rows pour compter toutes les lignes!

EDIT: Il existe 500 000 enregistrements! Alors peut-être qu'une itération à travers le résultat est lente, qu'en pensez-vous?

Merci pour toute l'aide :)

Répondre

10

Les réponses ci-dessus sont grands et tout, mais la réponse actuellement vérifiée fonctionnera très inefficacement devrait vous avoir affaire à une grande quantité des données

Exemple de réponse ci-dessus (par Gal)

$results = mysql_query("SELECT *,(SELECT COUNT(*) FROM table_name WHERE column=$value) count FROM table_name WHERE id=$id"); 

il est bon et tout, et il renvoie ce dont vous avez besoin, mais le défaut de conception évidente est que vous faire r Le serveur SQL renvoie les résultats, puis les renvoie et considère que le nombre est très inefficace pour de grandes quantités de données.

Il suffit de faire ceci:

$results = mysql_query("SELECT * FROM table_name WHERE column=$value"); 
$num_rows = mysql_num_rows($result); 

Il donnera les mêmes résultats et être beaucoup plus efficace à long terme, en plus pour les grandes quantités de données.

+0

Cela ne lui récupèrera pas les résultats + compte, seul le compte. De plus, votre requête est incomplète, révisez-la. – Gal

+1

La requête était incomplète, elle est maintenant corrigée pour refléter la suppression de la fonction count de la requête. De plus, Gal. Il compte combien sont contenus dedans. $ num_rows a le numéro. C'est plus efficace de cette manière, car en passant une requête, le serveur passe automatiquement le nombre d'éléments dans l'ensemble résultant auquel mysql_num_rows accède ($ result) – David

+0

merci, ça m'a aidé :) –

-2

itérer à travers des résultats de la requête et de garder un compte de combien de chaque apparaissent dans les variables locales.

+0

Il pourrait y avoir jusqu'à 500 mille lignes, l'itération serait-elle de choix ici, ou une autre requête, ou en quelque sorte utiliser le cache pour faire les choses plus rapidement? S'il vous plaît aidez-moi –

+0

Vous avez spécifié "sans faire une autre requête", donc je vous ai donné une option sans faire une autre requête. –

1

Effectuez une itération sur l'ensemble de résultats et comptez le nombre d'occurrences de Private et Company dans ad_type, respectivement?

+0

vérifier mise à jour s'il vous plaît –

3

Vous pouvez faire quelque chose comme:

$results = mysql_query("SELECT *,(SELECT COUNT(*) FROM table_name WHERE column=$value) count FROM table_name WHERE id=$id"); 

pour chercher le numéro avec sql.

+0

Est-ce mieux que l'itération à travers 500 mille enregistrements en termes de performance? –

+0

Je le pense (ce serait comme ça que je le ferais). Dans ce cas, le filtrage Mysql est préférable à l'itération du résultat avec PHP, surtout si vous avez un très grand nombre de lignes. – Gal

1

Quel est le problème avec le code que vous avez demandé à propos de here? Cela devrait atteindre votre effet désiré.

+0

J'ai déjà un ensemble de résultats, je ne veux pas une autre requête! –

0

Vous pouvez faire

SELECT COUNT(*) FROM table_name WHERE id=$id GROUP BY fieldvalue HAVING fieldvalue = "Private" 
SELECT COUNT(*) FROM table_name WHERE id=$id GROUP BY fieldvalue HAVING fieldvalue = "Company" 

mais ce serait une autre requête. Mais si vous traitez les données de toute façon, vous pouvez simplement additionner le nombre de lignes "Private" et "Company" après avoir fait la requête.

0

Dans le cas où vous n'avez pas besoin d'obtenir tous les résultats, utilisez ceci.

SELECT ad_type, COUNT(*) 
FROM table_name 
WHERE (id=$id) 
GROUP BY ad_type 
HAVING ((ad_type = 'Private') OR (ad_type = 'Company')) 

Si vous avez encore chercher tous les dossiers où id = $id, il ne fonctionnera pas. Mais l'exécution d'une telle requête (une fois) avant l'extraction des données réelles devrait être plus efficace que l'utilisation d'une sous-requête.

2

Si vous ne voulez pas changer votre requête, vous pouvez faire une

$results = mysql_query("SELECT * FROM table_name WHERE id=$id"); 
$count = mysql_num_rows($results); 
0

Je suppose que cette requête ferait le travail:

SELECT ad_type, count(*) FROM table_name WHERE id=$id GROUP BY ad_type; 

Je ne vois aucune raison à ce jour à utiliser HAVING, puisque vous voulez probablement montrer à l'utilisateur une vue d'ensemble de tous les ad_type trouvés dans DB (au moins vous n'avez pas mentionné qu'il y a d'autres valeurs pour ad_type alors les deux données). Je suggère également fortement de ne pas utiliser de sous-requêtes; essayez toujours d'en utiliser un seul. S'il y a une chose qui ralentira votre requête, c'est une sous-requête (ou sous-requêtes).

Bonne chance!

2

étapes pour obtenir un comptage():

  1. utilisation mysql_query() pour obtenir compter,
  2. utilisation mysql_fetch_array() pour obtenir la seule une rangée
  3. obtenir la seule colonne de la ligne , c'est le comte,

ici est un exemple, qui vérifient si le courriel est déjà utilisé:

// check whether email used 
$check_email_sql = "select count(*) from users where email='$email'"; 
$row = mysql_fetch_array(mysql_query($check_email_sql)); 
$email_count = $row[0]; 
Questions connexes