2014-10-20 3 views
0

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

У меня есть таблица, в которой хранятся продукты, которые были выбраны пользователями, и в этой таблице я храню время заказа, а также дату и время. Таким образом, structur - это индекс (PRIMARY INT), ordernr (INT), ordertime (TIMESTAMP), productid (INT), pickup (TINYINT), выбранное время (TIMESTAMP).

Теперь я хотел бы получить набор результатов для графика, который говорит: «Дата», количество упорядоченных продуктов и количество выбранных товаров, группа и упорядоченные по датам. Моя проблема теперь в том, что я получаю почти правильные цифры, но собранные счета подсчитываются в упорядоченном порядке, и я не могу заставить себя обдумать это.

SELECT (case when pickedup = '1' then DATE(order_detail.pickeduptime) else DATE(order_detail.ordertime) end) AS x,COUNT(productid) AS y,SUM(case when pickedup = '1' then 1 else 0 end) AS z FROM order_detail WHERE productid = '127' AND YEAR(`ordertime`) = YEAR(NOW()) GROUP BY x ORDER BY x asc 

Любая помощь будет очень полезна. :-)

ОБНОВЛЕНО:

1 index int(11)   AUTO_INCREMENT Primary 
2 ordernr int(11)   
3 productid int(11)  
4 price int(11)  
5 ordertime timestamp CURRENT_TIMESTAMP 
6 pickedup tinyint(4) 0 
7 pickeduptime timestamp 0000-00-00 00:00:00 

Как таблица выглядит.

+0

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

ответ

0

Первое, что могло бы помочь собственно форматирование SQL:

SELECT 
    (CASE 
    WHEN pickedup = '1' THEN DATE(pickeduptime) 
    ELSE DATE(ordertime) 
    END) AS x, 
    COUNT(productid) AS y, 
    SUM(CASE 
     WHEN pickedup = '1' THEN 1 
     ELSE 0 
     END) AS z 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) 
GROUP BY x 
ORDER BY x ASC 

Теперь мне нужно выяснить, что вы пытаетесь сделать. Вот где начинаются реальные проблемы. Неясно, будете ли вы повторно использовать строки в таблице для пикапа или нет. Извините, я не могу вам помочь. Вы SQL очень странный. Для чего-то такого простого, что вам не нужно будет использовать две команды CASE.

Я также не могу понять ваш SQL, группируя дату, которая исходит из двух столбцов?

После тщательного чтения я думаю, что я начинаю понимать, что вы хотите. Вы хотите посмотреть, сколько товаров заказывается и подбирается на каждую дату. Я бы не попытался сделать это с помощью одной команды SQL, а скорее использовал два. Две строки, две команды SQL. :-)

Первый простой: Как много продуктов, где упорядоченные, сгруппированные и упорядоченные по дате:

SELECT 
    DATE(ordertime) as orderdate, 
    COUNT(productid) AS quantity 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) 
GROUP BY orderdate 
ORDER BY orderdate ASC 

Теперь заказанные продукты, которые еще не забирали:

SELECT 
    DATE(ordertime) as orderdate, 
    COUNT(productid) AS quantity 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) AND 
    pickedup != '1' 
GROUP BY orderdate 
ORDER BY orderdate ASC 

и теперь товары, которые были подобраны, все еще отсортированы по заказу:

SELECT 
    DATE(ordertime) as orderdate, 
    COUNT(productid) AS quantity 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) AND 
    pickedup = '1' 
GROUP BY orderdate 
ORDER BY orderdate ASC 

И вот то же самое отсортировано по дате загрузки:

SELECT 
    DATE(pickeduptime) as pickedupdate, 
    COUNT(productid) AS quantity 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) AND 
    pickedup = '1' 
GROUP BY pickedupdate 
ORDER BY pickedupdate ASC 

Теперь вы можете использовать любой из них, чтобы нарисовать линию на своем графике.

Если вы настаиваете на одном запросе можно использовать этот один:

SELECT 
    DATE(ordertime) as orderdate, 
    SUM(pickedup) AS pickedup_quantity, 
    SUM(1-pickedup) AS not_pickedup_quantity 
FROM 
    order_detail 
WHERE 
    productid = '127' AND 
    YEAR(ordertime) = YEAR(NOW()) 
GROUP BY orderdate 
ORDER BY orderdate ASC 

Обратите внимание, что все должно быть отсортированы по одной дате.

+0

Спасибо за ваш ответ. Мне жаль, но моих навыков продвижения mysql не хватает, и это именно то, что я получил от этого, и я знаю, что это не очень хорошо. Я использую одну строку для каждого заказанного продукта и обновляю полученное значение и выбранное время, когда клиент выбирает его из магазина. – user1393970

+0

А, я вижу, теперь я понимаю, как это работает. Можете ли вы объяснить, что вы хотите показать на своем графике? Мне нужно знать, как вы хотите представлять упорядоченные и собранные продукты на своем графике. Смешанный, но заказанный по дате? Мне это мало смысла. –

+0

Im, использующий Morris.js, и хочу график с датой оси x и осью y с 2 строками, количеством товаров, заказанных в этот день, и количеством выбранных продуктов в эту дату. http://jsbin.com/uqawig/441/embed?js,output – user1393970

0

Не уверен, что это ваша проблема точно, но я думаю, что у вас есть ошибка синтаксиса: забыли поставить «ДЕЛО» после «END», как в MySQL Reference

+0

Моя проблема заключается в том, что я получаю список, но он неверен, pickup учитываются в переменной «y», но это должно быть примерно так: Дата, количество продуктов на эту дату, количество продуктов на этой странице Дата. – user1393970

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