2015-05-28 3 views
1

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

acc_prop

id | pid | uid 
1 | 10 | 1 
2 | 11 | 1 
3 | 12 | 1 

кал

id | pid 
1 | 10 
2 | 11 
3 | 12 

цена

cid | rate 
1 | 100 
2 | 99 
3 | 130 

Я хочу создать запрос, который возвращает pid, счетчик uid с тем же uid и скорость для этого pid.

ожидаемый результат

pid | uid_count | rate 
10 | 3   | 100 
11 | 3   | 99 
12 | 3   | 130 

мой запрос выглядит следующим образом

SELECT 
    cal.pid, 
    count(ap3.uid) as uid_count, 
    price.rate 
FROM 
    price 
JOIN 
    cal on cal.id = price.cid 
JOIN 
    acc_prop ap using(pid) 
JOIN 
    acc_prop ap2 on ap2.uid = ap.uid 
JOIN 
    acc_prop ap3 on ap3.uid = ap2.uid 
group by ap3.pid; 

Но она возвращает

  • неправильный подсчет
  • некорректный PID список
  • неверная скорость

фактический результат

pid | uid_count | rate 
10 | 9   | 100 
10 | 9   | 100 
+0

мы должны 'cal' вообще здесь делать? К сожалению, имена таблиц и имена внешних ключей не являются особенно интуитивными, поэтому его трудно представить в виде соединений. – StuartLC

+0

Не совсем, это просто базовое сокращение для примера. Но в моей реальной системе есть таблица cal, которая связывает pid с другими таблицами. В основном cal - это календарь, pid - свойствоId, а uid - userId. acc_prop - это таблица, которая связывает userId's с PropertyId's – dunsta

ответ

0

Я думаю, что вы после это, а именно предварительное вычисление количества пользователей в acc_prop в виде производной таблицы, которую вы можете затем присоединить к остальной части запроса:

SELECT 
    cal.pid, 
    UserCount.Cnt, 
    price.rate 
FROM 
    price 
    JOIN cal on cal.id = price.cid 
    JOIN acc_prop ap using(pid) 
JOIN 
(
    SELECT uid, COUNT(*) AS Cnt 
    FROM acc_prop 
    GROUP BY uid 
) UserCount 
ON ap.uid = UserCount.uid; 

SqlFiddle here

+0

. Это заработало, спасибо StuartLC. Я не очень хорошо разбираюсь в sub selects, надеюсь, этот пример даст мне некоторые намеки и в будущем. – dunsta

+0

Запрос, соединенный с псевдонимом как «UserCount», называется «производной таблицей» - они действительно полезны для разбиения больших проблем на более мелкие куски. Большинство других СУБД (к сожалению, еще не MySql) имеют «общие табличные выражения», которые могут использоваться для подобных сценариев. – StuartLC

0

Я думаю, что кал не нужен здесь, ты попытался это:

SELECT 
    acc_prop.pid, (SELECT COUNT(*) FROM acc_prop WHERE uid = uid) AS uid_count, price.rate 
FROM 
acc_prop 
INNER JOIN price 
ON acc_prop.id = price.cid 
Смежные вопросы