выборка из 3-х таблиц. В 2-х последних выбрать нужно только кол-во

brandy

Новичок
выборка из 3-х таблиц. В 2-х последних выбрать нужно только кол-во

Нужно выбрать из одной таблицы products все записи. А из таблиц comments(коментарии) и votes(голоса) количество этих самых коментариев и количество голосов к продуктам.

Пример.

products
+--------------+--------------------------------+
|-- prodID ----| prodName ----------------------|
+--------------+--------------------------------+
|-- 1 ---------| Name1 -------------------------|
+--------------+--------------------------------+
|-- 2 ---------| Name2 -------------------------|
+--------------+--------------------------------+
|-- 3 ---------| Name3 -------------------------|
+--------------+--------------------------------+
|-- 4 ---------| Name4 -------------------------|
+--------------+--------------------------------+

comments
+--------------+--------------------------------+---------------------------+
|commentID ----| prodID ------------------------| text ---------------------|
+--------------+--------------------------------+---------------------------+
|-- 1 ---------| 1 -----------------------------| text text text -----------|
+--------------+--------------------------------+---------------------------+
|-- 2 ---------| 1 -----------------------------| text2 text2 --------------|
+--------------+--------------------------------+---------------------------+
|-- 3 ---------| 1 -----------------------------| text3 text 3text ---------|
+--------------+--------------------------------+---------------------------+
|-- 4 ---------| 2 -----------------------------| text22 text22 ------------|
+--------------+--------------------------------+---------------------------+
|-- 5 ---------| 3 -----------------------------| text3 3text22 ------------|
+--------------+--------------------------------+---------------------------+

votes
+--------------+--------------------------------+---------------------------+
|voteID -------| prodID ------------------------| mark ---------------------|
+--------------+--------------------------------+---------------------------+
|-- 1 ---------| 1 -----------------------------| 5 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 2 ---------| 1 -----------------------------| 4 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 3 ---------| 2 -----------------------------| 3 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 4 ---------| 2 -----------------------------| 3 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 5 ---------| 4 -----------------------------| 4 ------------------------|
+--------------+--------------------------------+---------------------------+

нужна такая выборка, которая вернет
+--------------+--------------+---------------------+---------------------------+
| prodID ------| prodName ----| count(comments) ----| count(marks) -------------|
+--------------+--------------+---------------------+---------------------------+
|-- 1 ---------| Name1 -------| 3 ------------------| 2 ------------------------|
+--------------+--------------+---------------------+---------------------------+
|-- 2 ---------| Name2 -------| 1 ------------------| 2 ------------------------|
+--------------+--------------+---------------------+---------------------------+
|-- 3 ---------| Name3 -------| 1 ------------------| 0 ------------------------|
+--------------+--------------+---------------------+---------------------------+
|-- 4 ---------| Name4 -------| 0 ------------------| 1 ------------------------|
+--------------+--------------+---------------------+---------------------------+



-~{}~ 24.11.05 18:55:

Если бы было 2 таблицы (products и напимер votes) то все хорошо получалось бы с помощью вот такого запроса

select p.prodID, count(voteID) as votes
from products p
left join votes as v on p.prodID=v.prodID
group by p.prodID

-~{}~ 24.11.05 18:57:

С тремя же таблицами такая вот выборка работает неверно:

select p.prodID, count(voteID) as votes, count(commentID) as comments
from products p
left join votes as v on p.prodID=v.prodID
left join comments c on p.prodID=c.prodID
group by p.prodID
 

alpine

Новичок
А если count(voteID) as votes заменить на SUM(IF(voteID <> NULL, 1, 0)) as votes ну и count(commentID) as comments соответственно?

-~{}~ 25.11.05 22:36:

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

chira

Новичок
a так:
select p.prodID, count(distinct voteID) as votes, count(distinct commentID) as comments
from products p
left join votes as v on p.prodID=v.prodID
left join comments c on p.prodID=c.prodID
group by p.prodID

как говорит alpine с временными возможно будет быстрее
 

brandy

Новичок
alpine
chira
Спасибо огромное за помощь :)

-~{}~ 20.12.05 20:33:

Еще вопрос в продолжение темы.
Пример.

products
+--------------+--------------------------------+----------------+
|-- prodID ----| prodName ----------------------|--userID--------+
+--------------+--------------------------------+----------------+
|-- 1 ---------| Name1 -------------------------|--1-------------+
+--------------+--------------------------------+----------------+
|-- 2 ---------| Name2 -------------------------|--1-------------+
+--------------+--------------------------------+----------------+
|-- 3 ---------| Name3 -------------------------|--1-------------+
+--------------+--------------------------------+----------------+
|-- 4 ---------| Name4 -------------------------|--2-------------+
+--------------+--------------------------------+----------------+


votes
+--------------+--------------------------------+---------------------------+
|voteID -------| prodID ------------------------| mark ---------------------|
+--------------+--------------------------------+---------------------------+
|-- 1 ---------| 1 -----------------------------| 5 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 2 ---------| 1 -----------------------------| 4 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 3 ---------| 2 -----------------------------| 3 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 4 ---------| 2 -----------------------------| 3 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 5 ---------| 4 -----------------------------| 4 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 6 ---------| 4 -----------------------------| 3 ------------------------|
+--------------+--------------------------------+---------------------------+
|-- 7 ---------| 4 -----------------------------| 4 ------------------------|
+--------------+--------------------------------+---------------------------+


users
+--------------+--------------------------------+
|userID -------| userName ----------------------|
+--------------+--------------------------------+
|-- 1 ---------| Name 1 ------------------------|
+--------------+--------------------------------+
|-- 2 ---------| Name 2 ------------------------|
+--------------+--------------------------------+

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


+--------------+--------------------------------+------------+
|userID -------| userName ----------------------| cnt -------|
+--------------+--------------------------------+------------+
|-- 1 ---------| Name 1 ------------------------| 2 ---------|
+--------------+--------------------------------+------------+
|-- 2 ---------| Name 2 ------------------------| 1 ---------|
+--------------+--------------------------------+------------+




Сам смог сделать почти такой запрос

select u.*, p.prodID
from users u
left join products p on u.userID=p.userID
left join votes as v on p.prodID=v.prodID
group by p.prodID having count(voteID)>=2

который возвращает

+--------------+--------------------------------+------------+
|userID -------| userName ----------------------| prodID ----|
+--------------+--------------------------------+------------+
|-- 1 ---------| Name 1 ------------------------| 1 ---------|
+--------------+--------------------------------+------------+
|-- 1 ---------| Name 1 ------------------------| 2 ---------|
+--------------+--------------------------------+------------+
|-- 2 ---------| Name 2 ------------------------| 4 ---------|
+--------------+--------------------------------+------------+

Как теперь посчитать количество - не знаю :(

Заранее спасибо
 
Сверху