Хитрый вопрос; Отображение 'nr результатов' поиска MySql - PullRequest
1 голос
/ 22 февраля 2010

У меня есть сайт объявлений, и пользователи могут искать объявления.

Результаты отображаются в трех вкладках в верхней части страницы. Вот эти три: « Все », « Частный » и « Компания ». К каждой вкладке прикреплен номер, который представляет количество объявлений, найденных на этой вкладке.

Так, например:

  All     Private     Company
   5         3           2

All - это всего лишь частная + компания!

Я использую MySql в качестве базы данных.

Я пытаюсь найти способ узнать «количество найденных объявлений» для каждой вкладки.

У меня есть один способ сделать это, который похож на это, но вызывает головную боль, потому что это так грязно:

$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;
        }

Знаешь ли ты какой-нибудь другой способ, которым это можно сделать?

Спасибо

КСТАТИ : мне тоже нужны строки, чтобы показать пользователю найденную рекламу!

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Это зависит от того, что именно вам нужно. Если вам просто нужен подсчет, это относительно просто:

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

Если, с другой стороны, вам нужны как счетчики, так и данные строк, вы должны либо выполнить отдельные запросы для данных и счетчиков, либо использовать хитрость. Допустим, в вашей таблице есть столбец идентификатора с первичным ключом, который вы можете сделать:

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

Магия WITH ROLLUP даст вам дополнительную строку со счетчиками для всего запроса. Единственная загвоздка в том, что вы получите эту строку в качестве последней строки всего результата, поэтому, если вы хотите сообщить о количестве до данных, вам придется кэшировать данные строки в массиве php или около того и обрабатывать позже, чтобы создать страницу.

1 голос
/ 22 февраля 2010

После вашей переменной $query_priv_comp будет равно:

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

или

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

Вопрос: Какая разница ???

0 голосов
/ 22 февраля 2010

Вы можете выбрать все значения одним запросом:

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

Затем вы можете запросить все записи, необходимые для текущей вкладки.

Эти 2 должны быть четко разделены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...