2009-06-26 5 views
1

Скажем, у меня есть одна таблица под названием «ОБЗОРЫ»Помощь по SQL-запросам

В этой таблице есть отзывы, которые клиенты написал для различных продуктов.

Я хотел бы быть в состоянии получить «счетчик» для всех обзоров, что каждый клиент написал, так я пишу:

SELECT count(*) AS counter 
FROM reviews 
WHERE customers_id = 12345 

Теперь моя проблема заключается в том, что я хочу, чтобы иметь счет как указано выше, но только для тех клиентов, которые написали обзор конкретного продукта

например,

SELECT customers_review 
FROM reviews 
WHERE 
products_id = '170' 

в заключение, я хотел бы быть в состоянии получить Custo mater TOTAL COUNT для каждого обзора, который они написали, но ТОЛЬКО для клиентов, которые написали обзор для конкретного продукта.

Большое спасибо за помощь.

+0

спасибо всем за помощь мне, вы, ребята, рок! – 2009-06-26 20:40:38

+0

@Sebastian, теперь, когда вы ответили на свой вопрос, может быть, вы могли бы отредактировать свою тему в чем-то более конкретном? Мне неинтересно думать, сколько вопросов здесь имеет эта же тема. –

ответ

8
select customers_id, count(*) 
from reviews 
where customers_id in 
(select customers_id from reviews where products_id = '170') 
group by customers_id; 
+0

+1 за то, что он быстрее на ничью. – TheTXI

+0

существует, будет быстрее, чем в –

+0

Carl, спасибо за ваше предложение, но в качестве примечания, этот запрос, который вы мне предложили (а также вариант EXISTS), занимает довольно много времени, 8 - 14 секунд, чтобы запросить мой MYSQL, как вы думаете, есть ли возможность оптимизировать это, чтобы сделать его быстрее? спасибо ... – 2009-06-27 00:12:29

1

Просто добавьте в конце первого запроса

WHERE EXISTS (
SELECT 1 FROM reviews AS r 
WHERE r.customers_id = reviews.customers_id 
    AND product_id = '170') 
GROUP BY reviews.customers_id 
3
SELECT customers_id, COUNT(*) AS counter 
FROM reviews 
WHERE customers_id IN(
SELECT customers_id 
FROM reviews 
WHERE 
products_id = '170' 
) 
GROUP BY customers_id 

Это будет тянуть любой клиент, который писал о продукте X, а затем подсчитать общее количество отзывов они вывешенный.

+0

Черт побери, разница 27 секунд, это почти слово в слово! LOL – TheTXI

+1

+1 для того, чтобы дать счету (*) псевдоним – Lazlow

1
Select customer_ID, Count(*) 
FROM reviews 
WHERE customer_ID in (Select Customer_ID from reviews where products_id = '170') 
Group By customer_ID 

Это должно дать вам список всех CUSTOMERID наряду с графом всех своих обзоров, но это будет ограничивать его только клиентам, которые оставили отзыв для продукта 170.

+0

S'okay мы оба били :-) –

+0

Ian: Я проголосовал за оба ответа, которые были идентичны, но быстрее меня: P – TheTXI

0

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

  • Графа Отзывы по Клиенту на этом подробно ряд
  • Граф Отзывы К продукта на этой строке детализации
  • Граф Отзывы этого клиента на этом продукта на эта деталь строка
  • Любые детали (текст обзора обзор ID и т.д ...)

SQL Заявление

SELECT 
revid, 
CUSTID, 
PRODID, 
COUNT (*) OVER (PARTITION BY custid) ByCust, 
COUNT (*) OVER (PARTITION BY prodid) ByProd, 
COUNT (*) OVER (PARTITION BY prodid, custid) ByCustProd 

FROM customer_reviews 
ORDER BY custid, prodid 

--OUTPUT--

1520 106 1900 16 604 3 
4650 106 1900 16 604 3 
2730 106 1900 16 604 3 
4640 106 3900 16 254 1 
6287 110 1900 28 604 2 
5849 110 1900 28 604 2 
5965 110 3900 28 254 2 
6117 110 3900 28 254 2