2015-07-03 4 views
0

Когда у вас есть таблица, которая имеет отношения с двумя другими через FK, можно ли запросить основную таблицу, только считая, сколько раз ее идентификатор существует в других 2?MySQL присоединяется при подсчете объединенных таблиц

Например:

id title product_id contact_id 
------ ------- ---------- ---------- 
    11 Mug    110   33 
    11 Mug    110   297 
    11 Mug    378   33 
    11 Mug    378   297 
    12 Monster   299   75 
    12 Monster   299   291 
    12 Monster   299   296 

Мой запрос, который приводит к выше:

SELECT t1.id, t1.title, t2.product_id, t3.contact_id FROM t1 
    JOIN t2 ON t1.id = t2.rfq_id 
    JOIN t3 ON t1.id = t3.rfq_id 

Я заинтересован только в COUNT():

id title product_count contact_count 
------ ------- ------------- ------------- 
    11 Mug     2    2 
    12 Monster    1    3 

ответ

1

Вы можете попробовать с group by и count только distinct значения:

select t1.id 
    , t1.title 
    , count(distinct t2.product_id) as product_count 
    , count(distinct t3.contact_id) as contact_count 
from t1 
join t2 on t1.id = t2.rfq_id 
join t3 on t1.id = t3.rfq_id 
group by t1.id 
     , t1.title 
+0

@enchance: поскольку все столбцы, перечисленные в 'select', должны быть либо агрегированы (например, с' count'), либо присутствовать в предложении 'group by', чтобы явно указать, что вы хотите получить. MySQL слишком либеральна, поэтому вы не получите никаких ошибок, но это может привести к тому, чего вы не ожидали. – potashin

+0

Любопытно, если у меня есть больше полей типа 't1.created_at' и т. Д., Я также должен добавить его в список' GROUP BY' или '' '' '' '' '' '' 'достаточно? – enchance

+0

@enchance: Ну, это зависит от вывода, может быть, вы должны присоединиться к таблице к себе и получить 't1.created_at' в соответствии с ее уникальным' t1.id'. – potashin

0

Вы можете сделать что-то вроде:

SELECT t1.id, t1.title, 
     COUNT(DISTINCT t2.product_id) AS product_count, 
     COUNT(DISTINCT t3.contact_id) AS contract_count 
FROM t1 
JOIN t2 ON t1.id = t2.rfq_id 
JOIN t3 ON t1.id = t3.rfq_id 
GROUP BY t1.id, t1.title 
+0

Почему нужен 't1.title'? Извините, мне трудно понять 'GROUP BY', используя 2 или более полей. – enchance

+0

@enchance Это требование SQL, согласно которому каждый неагрегированный столбец предложения SELECT должен появляться в предложении GROUP BY. MySQL более расслаблен в этой проблеме, поэтому вы можете оставить 't1.title' из' GROUP BY', если хотите. Я бы не рекомендовал этого. –

1

Попробуйте эти

SELECT t1.id, t1.title, 
     count(distinct t2.product_id) as product_id, 
     count(distinct t3.contact_id) as contact_id FROM t1 
    JOIN t2 ON t1.id = t2.rfq_id 
    JOIN t3 ON t1.id = t3.rfq_id 
    group by t1.id, t1.title 

Спасибо.

Смежные вопросы