2010-02-22 3 views
1

J'ai un site Web de petites annonces, et les utilisateurs peuvent rechercher des annonces.Truc Question; Montrer 'nr de résultats' de MySql search

Les résultats sont affichés dans trois onglets en haut de la page. Ces trois sont "Tous", "Privé" et "Société". Chaque onglet est associé à un nr qui représente le nombre d'annonces trouvées dans cet onglet.

Ainsi, par exemple:

All  Private  Company 
    5   3   2 

All est juste un total de la société privée +! J'utilise MySql comme base de données.

J'essaie de trouver un moyen de trouver ces "nombres d'annonces trouvées" pour chaque onglet.

je une façon de le faire, ce qui est comme ça, mais me donne un mal de tête, car il est tellement en désordre:

$query = "SELECT SQL_CACHE * FROM classified WHERE classified.classified_id=$id"; 

     if ($adtypes=="Private"){ 
     $query_priv_comp = "SELECT SQL_CACHE * FROM classified WHERE priv_comp='Company'"; 
     } 
     else { 
     $query_priv_comp = "SELECT SQL_CACHE * FROM classified WHERE priv_comp='Private'"; 
     } 

     switch ($adtypes){ 
      case "Private": 
       $query.= " AND classified.priv_comp='Private'"; 
      break; 

      case "Company": 
       $query.= " AND classified.priv_comp='Company'"; 
      break; 
     } 

     $qry_result = mysql_query($query); // main query 
     $result_priv_comp = mysql_query($query_priv_comp); // second query 

     $num_priv_comp = mysql_num_rows($result_priv_comp); 
     if ($adtypes=="All"){ 
     $num_total = mysql_num_rows($qry_result); 
     } 
     else if ($adtypes!="All"){ 
      $num_total=mysql_num_rows($qry_result) + mysql_num_rows($result_priv_comp); 
     } 

     if ($adtypes=="Private"){ 
     $num_private = $num_total - $num_priv_comp; 
     $num_company = $num_priv_comp; 
     } 
     else { 
     $num_company = $num_total - $num_priv_comp; 
     $num_private = $num_priv_comp; 
     } 

Connaissez-vous une autre manière que cela peut être fait?

Merci

BTW: J'ai besoin les lignes aussi, afin d'afficher des informations à l'utilisateur des annonces trouvées!

+0

Veuillez clarifier, avez-vous besoin des chiffres, ou avez-vous besoin des rangées individuelles aussi? –

+0

J'ai aussi besoin des rangées, pour afficher aussi les informations! –

+0

Ok. bien lu sur ma réponse alors. –

Répondre

2

Cela dépend de ce dont vous avez besoin exactement. Si vous avez juste besoin les chefs d'accusation, il est relativement facile:

SELECT count(*)       count_all 
,  sum(if(priv_com = 'Private', 1, 0)) count_private 
,  sum(if(priv_com = 'Company', 1, 0)) count_company 
FROM classified 
WHERE classified.classified_id=$id 

Si d'autre part, vous avez besoin des deux chefs d'accusation ainsi que des données de ligne, vous devez soit faire des requêtes distinctes pour les données et les comptes, ou utiliser une astuce . Disons que votre table a une wich colonne id est la clé primaire, vous pourriez faire:

SELECT count(*)       count_all 
,  sum(if(priv_com = 'Private', 1, 0)) count_private 
,  sum(if(priv_com = 'Company', 1, 0)) count_company 
,  classified.* 
FROM classified 
WHERE classified.classified_id=$id 
GROUP BY id -- group by on primary key 
WITH ROLLUP 

La magie WITH ROLLUP vous donnera une ligne supplémentaire avec les comptes pour toute requête. Le seul hic est que vous recevrez cette ligne comme dernière ligne du résultat entier, donc si vous voulez rapporter les comptes avant les données, vous devrez mettre en cache les données de ligne dans un tableau php ou plus et traiter ce plus tard pour construire la page.

+0

effectivement ce dont j'ai vraiment besoin, ce sont les lignes pour l'onglet actuellement affiché. Ainsi, si l'utilisateur clique sur l'onglet "privé", seules les lignes de toutes les annonces "privées" sont nécessaires et ainsi de suite. Mais c'est une méthode utile je pense. Merci –

+0

Camran, ok, gotcha. Eh bien je suppose que je ferais probablement des requêtes séparées alors, une pour le compte et une pour les données. Si la performance est un problème, je conseillerais probablement de garder une trace des chiffres dans un tableau agrégé séparé. –

+0

La performance est un problème à coup sûr. Pourriez-vous nous en dire plus sur la table globale? Qu'est-ce que c'est? Merci –

0

Vous pouvez sélectionner tous les comptes avec une seule requête:

SELECT priv_comp, COUNT(*) AS record_count FROM classified GROUP BY priv_comp 

Ensuite, vous pouvez interroger tous les enregistrements nécessaires à l'onglet en cours.

Ces 2 doivent être séparés clairement.

1

Après votre commutateur variables $query_priv_comp serait égal à:

SELECT SQL_CACHE * FROM classified WHERE priv_comp='Company' 
    AND classified.priv_comp='Private' 

ou

SELECT SQL_CACHE * FROM classified WHERE priv_comp='Private' 
AND classified.priv_comp='Company' 

Question: Quelle est la différence ???

+0

Lire avant de commenter, deux requêtes différentes –