2012-04-29 4 views
0

Noob вопрос для вложенного запроса. Имея небольшую проблему с этим SQL-запросом. Пожалуйста помоги. Попытка указать поля COUNT 2 в одной таблице и группе по месяцам, годам. Запрос возвращает те же результаты в новых и обновленных полях.Вложенная группа MYSQL от MONTH, YEAR

SELECT MONTH(p.created_at) as Month, YEAR(p.created_at) as Year, 
    (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id 
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 8) as 'New', 
    (SELECT COUNT(p.id) FROM payments p 
INNER JOIN carts c ON c.payment_id = p.id 
INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id = 13) as 'Renewal',  
FROM payments p 
GROUP BY month, year 

Спасибо за помощь!

Запрос Expample

Month Year New Renewal 
1  2010 1169 556 
1  2011 1169 556 
1  2012 1169 556 
2  2010 1169 556 
2  2011 1169 556 
+0

Предоставьте несколько примеров данных, и на них будет легче ответить. Покажите нам, каков результат этого запроса и какой результат вы хотите. –

+0

Да, пожалуйста, покажите нам некоторые данные примера. Кроме того, что произойдет, если вы выберете подзапросы и запустите их самостоятельно? Похоже, что единственное различие заключается в том, что 'ci.item_id' составляет 8 или 13, верно? Это правильный номер для 'new' или' renewal' в вашей базе данных? – Daan

+0

Добавлены данные примера из вышеуказанного запроса. Item_id = 8 является новым в db, а 13 - обновлением в db. Если я вытащил простой выбор без добавления второго продукта, все данные выдаются, как я хотел. Похоже, @nishant ответил ниже – tumolo

ответ

0

Глядя на ваш запрос, я предполагаю, у вас есть таблица пунктов который содержит различные возможные приобретаемые предметы. Из которых item_id = 8 соответствует «новому» продукту, а item_id = 13 соответствует «обновлению».

элементы связаны с событием предполагаемой продажи в таблице отношений, называемой cart_items.

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

Запланирована ли предполагаемая продажа или нет, записана в таблице тележек, заполнив pay_id.

Плата представляет собой корзину, которая была продана, мы получаем payment.id из платежей, мы берем pay_id на стол повозки и получаем cart_id, который мы берем в таблицу cart_items, и получаем фактические предметы, которые были проданы, и мы хотим, чтобы посчитать его отдельно, если item_id 8 («New»)/13 («Обновление»)

запрос мы пытаемся запустить тогда:

SELECT MONTH(p.created_at) as Month, 
     YEAR(p.create_at) as Year, 
     sum(if(ci.item_id = 8, 1, 0)) as New, 
     sum(if(ci.item_id = 13, 1, 0)) as Renewal 
    FROM payments p, 
     INNER JOIN carts c on c.payment_id = p.id 
     INNER JOIN cart_items ci on ci.cart_id = c.id 
WHERE ci.item_id in (8,13) 
GROUP BY month, year; 

мы получаем цельные набор данных, мы группируем поля, которые мы хотим сгруппировать, и суммируем их, подсчитывая количество раз, когда мы видим item_id = 8/item_id = 13.

Возможно, я неправильно понял область проблем, поэтому, пожалуйста, дайте мне знать, если вам нужно разъяснение или я получил что-то неправильно.

+0

спасибо за вышеуказанный запрос, вы прекрасно поняли .. забыли про инструкции if в запросах. Можете ли вы объяснить, 1, 0 в выражении if? – tumolo

+0

Жук не проверял. Мы хотим только сосчитать то, что соответствует условию if, поэтому мы устанавливаем их как 1 для true и 0 для false, тогда, когда мы используем функцию sum (вместо count), получаем счетчик значений, для которых, если условие истинно. Это помогает? –