У меня две колонки brand
а также date_time
и во время выбора я назначаю их псевдонимам. Запрос ниже:
SELECT brand,
YEAR(date_time) AS 'year',
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh,
SUM( brand = 'SUB' ) AS sub
FROM scan_report
GROUP BY YEAR(date_time)
Результат к этому:
Теперь вот запутанная часть. Как я могу использовать Date_Sub
функция отображения данных только за последние 5 лет. Я имею в виду пользователь войдет 2014
и будет отображать / выбирать только записи за последние 5 лет, что означает от 2010 to 2014
,
С помощью WHERE
такие как это дали мне пустые записи:
SELECT
YEAR(date_time) AS 'year',
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh,
SUM( brand = 'SUB' ) AS sub
FROM scan_report WHERE DATE_SUB(2014, INTERVAL 5 YEAR)
GROUP BY YEAR(date_time)
или это
FROM scan_report WHERE DATE_SUB(year = 2014, INTERVAL 5 YEAR)
Любая идея, как я могу получить запись за последние 5 лет пользовательского ввода? Я предпочитаю решать эту проблему с MySQL, если не найдено решение, чем я пойду с php. Заранее спасибо.
Сделайте эту простую математику в PHP:
$year = 2014; # from $_POST or anywhere else
$from = ($year - 4) . '-01-01 00:00:00';
$to = $year . '-12-31 23:59:59';
А затем использовать эти 2 переменные в запросе.
$sql = "...
WHERE date_time BETWEEN '$from' AND '$to'
...
";
Если вы не хотите рассчитывать в PHP, вы можете рассчитать в MySQL:
$sql = "...
WHERE
date_time BETWEEN CONCAT({$year}-4, '-01-01 00:00:00') AND CONCAT({$year}, '-12-31 23:59:59')
...
";
$sql = "...
WHERE
YEAR(date_time) AND {$year}-4 AND {$year}
...
";
Ваша проблема в том, что предикат в предложении WHERE возвращает NULL для каждой строки, поэтому строки не возвращаются.
DATE_SUB
Функция принимает выражение DATE в качестве первого аргумента, а не целое число. То есть вы могли бы указать '2014-01-01'
в качестве первого аргумента, а не 2014
, Это вернуло бы ненулевую дату, которая оценивалась бы как ИСТИНА (в логическом контексте), поэтому все строки были бы возвращены.
Чтобы включить строки, которые имеют конкретные значения date_time
вам нужно использовать сравнение в предикате (предложение WHERE). Чтобы вернуть строки со значениями date_time ‘2009-01-01’ и позже …
SELECT YEAR(t.date_time) AS year
, SUM( t.brand = 'KFC' ) AS kfc
, SUM( t.brand = 'PZH' ) AS pzh
, SUM( t.brand = 'SUB' ) AS sub
FROM scan_report t
WHERE t.date_time >= DATE_SUB('2014-01-01', INTERVAL 5 YEAR)
GROUP BY YEAR(date_time)
Некоторые дополнительные примечания: если вам нужно (или вы хотите) экранировать идентификатор (например, имя столбца, потому что это зарезервированное слово), заключите идентификатор в символы обратной кавычки, а не в одинарные кавычки, например.
SELECT YEAR(`t`.`date_time`) AS `year`