2014-12-21 2 views
0

После 2 дней поиска и поиска похожих вопросов, он дошел до точки, где мне нужно задать вопрос!MySQL Один-ко-многим SUM от COUNTs

I имеют следующую структуру базы данных (упрощенный) ..

mt_product   | mt_sku        | mt_price 
==========   | ======        | ======== 
id | brand_id | mpn | id | product_id | retailer_id | sku | id | sku_id | price | date 

Например ...
* Можение Coca-Cola является один продукт.
* Его можно продавать во многих разных магазинах, у которых у всех будет SKU.
* Этот SKU будет иметь цену, которая может меняться день ото дня.

Я хочу перечислить общее количество цен на продукт.
Чтобы перечислить это я в настоящее время имею следующий запрос, который почти работает ...

SELECT 
p.id AS pid, p.title AS p_title, p.cat, p.mpn, 
b.id AS bid, b.name AS brand, 
(SELECT COUNT(s.id) FROM mt_sku AS s WHERE s.pid = p.id) AS num_sku, 
(SELECT COUNT(gbp.id) FROM mt_price AS gbp INNER JOIN mt_sku ON mt_sku.id = gbp.sid) AS num_price 
FROM mt_product AS p 
INNER JOIN mt_brand b ON p.bid = b.id 
INNER JOIN mt_sku s ON p.id = s.pid 

num_sku возвращается, как и ожидался, однако, когда я ввожу второй вспомогательный запрос для num_price (и я это много раз пересмотренный) я либо get ...
* no duplications of pid, но num_price - общее количество цен на SKUs, а не количество цен на этот товар_ид (в качестве запроса выше) eg1_img * правильное количество num_price, но вместо суммируя общее число num_price, pid дублируется в таблице (в качестве запроса ниже) - поэтому, поскольку pid дублируется, это не дает мне результата Я хочу. Я добавил DISTINCT, поскольку это помогло более ранней версии запроса, теперь это не имеет никакого значения. eg2_img

SELECT 
DISTINCT(p.id) AS pid, p.title AS p_title, p.cat, p.mpn, 
b.id AS bid, b.name AS brand, 
(SELECT COUNT(s.id) FROM mt_sku AS s WHERE s.pid = p.id) AS num_sku, 
(SELECT COUNT(gbp.id) FROM mt_price AS gbp WHERE s.id = gbp.sid) AS num_price 
FROM mt_product AS p 
INNER JOIN mt_brand b ON p.bid = b.id 
INNER JOIN mt_sku s ON p.id = s.pid 

Я уверен, что ключ к этому является то, что
продукт может иметь несколько наименований, из которых SKU имеет несколько ценовую историю.

Любая помощь или идеи схемы будет превосходной.

+0

Добавьте короткий пример, содержащий 2-3 строки из каждой таблицы и ожидаемый результат запроса; это поможет нам понять вашу проблему. – axiac

+0

Спасибо ... Первый запрос дает это - [link] (http://mrflibble.xyz/img/qry_eg2.PNG) Второй запрос дает это - [link] (http://mrflibble.xyz /img/qry_eg3.PNG) – themrflibble

+0

Вывод ваших запросов не очень помогает. Поместите входные данные и вывод, который вы ** ожидаете **. – axiac

ответ

0

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

SELECT 
    p.id AS pid, p.title AS p_title, p.cat, p.mpn, 
    b.id AS bid, b.name AS brand, 
    COUNT(DISTINCT s.id) AS num_sku, 
    COUNT(gbp.id) AS num_price 
FROM mt_product AS p 
    INNER JOIN mt_brand b ON p.brand_id = b.id 
    INNER JOIN mt_sku s ON p.id = s.product_id 
    INNER JOIN mt_price gbp ON s.id = gbp.sku_id 
GROUP BY b.id, p.id 

Продукты, которые не имеют SKUs определены не будут появляться в наборе результатов. Используйте LEFT JOIN mt_sku, чтобы сделать их в результирующем наборе (имеющей 0 для num_sku и num_price):

LEFT JOIN mt_sku s ON p.id = s.product_id 

В обоих вариантах запроса, продукты, которые не имеют цены, определенные не будут появляться в наборе результатов.Используйте LEFT JOIN mt_price, чтобы включить их в результирующий набор (имеющего 0 для num_price):

LEFT JOIN mt_price gbp ON s.id = gbp.sku_id 

Посмотрите на документацию MySQL для JOINs, GROUP BY и GROUP BY aggregate functions.

+0

Я думаю, что мы приближаемся (большое спасибо еще раз, это отличное сообщество!) Однако это возвращает только одну строку. [link] (http://mrflibble.xyz/img/qry_eg5.PNG). Два COUNT возвращают общее число, а не сумму для этого одного product.id() pid). Он должен вернуть все, я думаю, что подзапросы все еще являются ответом на это. Я собираюсь продолжать пытаться, но все же это бесполезно. – themrflibble

+0

Почти там! Этот запрос [ссылка] (http://mrflibble.xyz/img/qry_eg6.PNG) дает это [ссылка] (http://mrflibble.xyz/img/qry_eg7.PNG) - впервые общее количество цен верно. Однако pid дублируется. Если бы они были суммированы, поэтому pid только существует в результатах один раз, то это было взломан! – themrflibble

+0

Для правильного подсчета SKU необходимо использовать 'DISTINCT'. Я обновил код. – axiac

0

Если вы хотите перечислить общие цены, то вам потребуются корреляции.

Ваш первый счет хорош, потому что он коррелирован с внешним запросом. Второй не имеет корреляции, так что это кажется странным. Следующие крепит num_price подзапрос:

SELECT p.id AS pid, p.title AS p_title, p.cat, p.mpn, 
     b.id AS bid, b.name AS brand, 
     (SELECT COUNT(s2.id) FROM mt_sku s2 WHERE s2.pid = p.id) AS num_sku, 
     (SELECT COUNT(gbp.id) FROM mt_price gbp WHERE s.id = gbp.sid) AS num_price 
FROM mt_product p INNER JOIN 
    mt_brand b 
    ON p.bid = b.id INNER JOIN 
    mt_sku s 
    ON p.id = s.pid; 

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

+0

Спасибо, что нашли время ответить. Я использовал выше, но запрос вернулся к повторению pid's. [link] (http://mrflibble.xyz/img/qry_eg1.PNG) – themrflibble

+0

Нет корреляции, потому что один pid может иметь несколько SKU, эти SKU могут иметь несколько цен. Я хочу подсчитать, сколько всего там цен. Итак, num_SKU правильно получает количество SKU для pid, однако num_price с вашим примером дает только сумму цены для этого идентификатора SKU, а не суммирует все SKU и возвращает один pid (см. Ссылку выше для результата) – themrflibble

+0

Вы должны отредактировать свой вопрос и добавить образцы данных и желаемые результаты. –