2016-10-04 4 views
1

Я пытаюсь выбрать и группировать по дате из MySQL.sql select и group by CURRENT_TIMESTAMP

таблица выглядит следующим образом:

`id` int(11) NOT NULL, 
    `run_data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `date_day` varchar(20) NOT NULL, 
    `number_of_links` int(20) NOT NULL, 

для выбора, я использую:

SELECT date_day, SUM(number_of_links) FROM my_table GROUP BY date_day DESC LIMIT 30 

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

$date_day = date('d/m/Y', time()); 

любые идеи, как исправить это?

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

GROUP BY TO_DAYS(`run_data`) 
GROUP BY MONTH(run_data) 
GROUP BY DATE(STR_TO_DATE(run_data)); 
+1

Может быть глупый вопрос, но почему бы не держать дату в правильном столбце DATE формат? например, DATE – nospor

+0

Прямо сейчас вы усложняете столь простую вещь – nospor

+0

Можете ли вы показать примерную строку данных, сохраненных внутри таблицы –

ответ

1

Поле date_day не сортируется. По крайней мере, если вы не напишите для него собственную логику, которая обычно выполняется в PHP; Или делаете листинг по каждому запросу, что может быть очень дорогостоящим для базы данных (не говоря уже о некорректных результатах).

Как уже упоминалось в комментарии от @nospor, правильный ответ на этот вопрос заключается в том, чтобы изменить поле как правильное поле date. Затем вы можете легко сортировать и/или группировать его.
Для этого я рекомендую посмотреть на синтаксис ALTER TABLE в .

+0

спасибо, а что насчет 'run_data' datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,? могу ли я использовать это? – fernando

+0

Это зависит от того, содержит ли он те же данные, что и поле 'date_day'. Поскольку я не знаю ответа на это, я не могу сказать точно. Хотя, если они содержат одни и те же данные, почему для этого есть два поля? – ChristianF

0

Ваш date_day имеет varchar типа, поэтому отсортировать результат по date_day вы должны бросить его в date тип данных, как это:

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY CAST(date_day AS DATE()) DESC 
LIMIT 30 
+0

@Toby благодарит за сообщение – Ashu

1

Предполагая, что вы date_day хранится как строка в формате «D/M/Y» вы shold преобразовать строку в дату

SELECT date_day, SUM(number_of_links) 
FROM my_table 
GROUP BY date_day 
ORDER BY str_to_date(date_day, '%d/%m/%Y') DESC 
LIMIT 30 
+0

Написано в каком формате у него есть строка ... Пожалуйста, не принимайте sth, который уже указан. – nospor

+0

@nospor .. столбец в таблице является varchar, и в моем ответе в начале есть предупреждение для формата – scaisEdge

+0

Он сказал точно, в каком формате у него есть эта дата ... Это «d/m/Y» not как вы предположили dd-mm-yyyy – nospor