Группировать и считать несколько полей одновременно - PullRequest
1 голос
/ 29 мая 2011

Можно ли объединить эти запросы, чтобы критерии поиска выполнялись только один раз?

SELECT category, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY category

SELECT state, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY state

SELECT price_range, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY price_range

...

Plus about 10 more COUNTS

Моя цель - создать фильтр, подобный тому, который используется в на этом сайте .

Я думаю об использовании какой-то поисковой системы (например, Lucene) вместо реляционной базы данных.Новые идеи приветствуются.

Ответы [ 4 ]

3 голосов
/ 29 мая 2011

Что такое СУБД? В Oracle вы можете сделать это с помощью аналитических функций:

SELECT category, state, price_range,
       COUNT( 1 ) OVER ( PARTITION BY category ) AS category_count,
       COUNT( 1 ) OVER ( PARTITION BY state) AS state_count,
       COUNT( 1 ) OVER ( PARTITION BY price_range ) AS price_count
  FROM ads
2 голосов
/ 29 мая 2011

Эдуардо, Вам разрешено использовать хранимую процедуру? Если это так, вы можете сначала выполнить общую часть.

SELECT ... 
FROM   ads WHERE  [search criteria]

Тогда вы можете сделать несколько запросов на меньшую таблицу. Вы также можете сохранить результаты и вернуть все как одну таблицу с тремя столбцами:

  1. тип (категория, состояние, ценовой диапазон и т. Д.)
  2. имя (на самом деле значение категории / состояния / и т. Д.)
  3. Количество * * +1011
1 голос
/ 31 мая 2011

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

0 голосов
/ 30 мая 2011

вы можете сделать с помощью вложенного запроса и некоторых хитростей;)

  select category,countCategory,state,countState,price_range,countPrice_range from 
    (SELECT 1 pcol,category, count(*) countCategory
    FROM   ads
    WHERE  [search criteria]
    GROUP BY category) 
    a
    inner  join
    (
    SELECT 1 pcol,state, count(*) countState
    FROM   ads
    WHERE  [search criteria]
    GuROUP BY state
    ) b
    on a.pcol=b.pcol
    inner join
    (SELECT 1 pcol,price_range, count(*) countPrice_range
    FROM   ads
    WHERE  [search criteria]
    GROUP BY price_range)
    )
    on a.pcol=b.pcol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...