2012-04-27 5 views
3

У меня есть 3 таблицыподсчета MYSQL связанных строк в таблицах 2

products table 
productid productname 
--------- ----------- 
1   product 1 
2   product 2 
5   product 3 
10   product 4 
11   product 5 
12   product 6 

accounts_products table 
id productid accountid 
-- --------- --------- 
1 1   accountid 1 
2 10   accountid 2 
3 2   accountid3 

leads_products table 
id productid leadid 
-- --------- --------- 
1 1   leadid 1 
2 5   leadid 2 
3 2   leadid 3 

Я пытаюсь подсчитать, сколько общей продукции в leads_products и accounts_products таблицы, основанную на том же ProductID х.

Expected result 

Product ID Product Name Total 
----------- ------------ -------- 
1    product 1   2 
2    product 2   2 
5    product 3   1 
10   product 4   1 

я пытался до сих пор

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     COUNT(*) as 'Total' FROM products p 
INNER JOIN leads_products l ON (l.productid=p.productid) 
INNER JOIN accounts_products a ON (a.productid=p.productid) 
GROUP BY p.productname,p.productid 

Над подсчетов запроса и отображения большего количества, чем ожидалось.

Надеюсь, это имеет смысл.

+4

Что с того, что вы пробовали? –

+4

Тестовая схема: http://www.sqlfiddle.com/#!2/f8472. С примером запроса OP: http://www.sqlfiddle.com/#!2/f8472/1 – mellamokb

ответ

8

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

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     (SELECT COUNT(*) 
     FROM leads_products AS l 
     WHERE l.productid = p.productid) + 
     (SELECT COUNT(*) 
     FROM accounts_products AS a 
     WHERE a.productid=p.productid) AS 'Total' 
FROM products AS p 

http://www.sqlfiddle.com/#!2/f8472/5

Альтернативный подход с использованием JOIN (лучше):

SELECT p.productid as 'Product ID', 
     p.productname as 'Product Name', 
     IFNULL(l.count, 0) + IFNULL(a.count, 0) as 'Total' 
FROM products AS p 
LEFT JOIN (
    SELECT productid, COUNT(*) AS count 
    FROM leads_products 
    GROUP BY productid 
) AS l 
ON l.productid = p.productid 
LEFT JOIN (
    SELECT productid, COUNT(*) AS count 
    FROM accounts_products 
    GROUP BY productid 
) AS a 
ON a.productid = p.productid 

http://www.sqlfiddle.com/#!2/f8472/33

+0

Можете ли вы объяснить, почему запрос OP не выполнялся так, как ожидалось? – eggyal

+0

Он вычисляет кросс-произведение, а не сумму. Вместо 1 + 1 он получает 1 * 1, а вместо 1 + 0 получает 1 * 0. –

+0

@ Ваш комментарий почти работает. Он отображает каждую запись в таблице продуктов. Если нет счета, он отображает количество как 0. Любые идеи? Благодарим вас за быстрый ответ. – librium

-1

Я сделал это с левой присоединиться к р. продукты для сохранения всех продуктов тогда считали pr одуктов в каждом списке и добавили их вместе. Сначала попыталась. Вероятно, есть миллиард способов сделать это.

SELECT p.productid 'Product ID', 
     p.productname 'Product Name', 
     COUNT(a.accountid) + COUNT(l.leadid) total 
FROM products p 
LEFT JOIN accounts_products a ON p.productid = a.productid 
LEFT JOIN leads_products l ON p.productid = l.productid 
GROUP BY p.productid 

http://www.sqlfiddle.com/#!2/f8472/37

+0

Добавьте одну дополнительную строку, и она дает неверный результат: http://sqlfiddle.com/#!2/8ca24/1 –

+0

@MarkByers - Вы проверили это самостоятельно? Я получил желаемый результат OP – Scarecrow

+0

@ Scarecrow736: Он даже привязал вас к sqlfiddle, демонстрирующему его точку. -1 – eggyal

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