3 таблицы. Сложная выборка, как сделать?

brandy

Новичок
3 таблицы. Сложная выборка, как сделать?

Пример.

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

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 ------------------------|
+--------------+--------------------------------+---------------------------+




нужна такая выборка, которая вернет всех пользователей, количество добавленных ими продуктов, за которые проголосовали минимум 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 ---------|
+--------------+--------------------------------+------------+

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

Заранее спасибо
 

gray07

Новичок
Для этого можно использовать подзапрос вроде такого

[sql]
select u.*, count(p.prodID)
from users u
left join products p on u.userID=p.userID
group by u.userID
where (SELECT count(*) from votes v where p.prodID=v.prodID) >= 2
[/sql]

Подзапросы работают помоему только начиная с mysql 4.1
 

brandy

Новичок
gray07
CCCP_MOCKBA

спасибо, но у меня mysql 4.020 и поменять его нет возможности. Может кто-нибудь знает как сделать без вложенных Select'ов?
 

white phoenix

Новичок
А еще можно объявлять временные переменные в запросе, в данном случае это лучше чем лишняя таблица.

-~{}~ 28.12.05 04:26:

[sql]
SELECT @subselect := COUNT(*) FROM votes v WHERE p.prodID=v.prodID;
SELECT u.*, COUNT(p.prodID)
FROM users u
LEFT JOIN products p on u.userID=p.userID
GROUP BY `u.userID `
WHERE @subselect >= 2
[/sql]
[/QUOTE]
Изначально запрос составил gray07.
 

chira

Новичок
white phoenix

ты часом не поторопился?
твой второй запрос вернёт либо все записи, либо ни одной
 
Сверху