Вы можете использовать переменную MySQL. Например:
SET @ttt = 0;
SELECT
@ttt := IF(
`company_code`=(SELECT `company_code` FROM `range` r2 WHERE r2.`period_month`<r1.`period_month` ORDER BY `period_month` DESC LIMIT 1),
@ttt,
@ttt+1) iter,
`period_month`,
`company_code`
FROM `range` r1
WHERE emp_code = 'NIK001'
ORDER BY period_month ASC;
На моих тестовых данных это дает мне:
iter period_month company_code
1 1 Alpha
1 2 Alpha
1 3 Alpha
2 4 Beta
2 5 Beta
2 6 Beta
3 7 Alpha
3 8 Alpha
3 9 Alpha
3 10 Alpha
Идея состоит в том, что в каждой строке вы проверяете, равен ли текущий company_code
значению предыдущей записи. Если он другой, увеличьте переменную.
Это шаг вперед. Но как сгруппировать строки? Вы не можете сгруппировать их напрямую, но вам нужно обернуть этот запрос вторым.
SET @ttt = 0;
SELECT `company_code`,MIN(`period_month`),MAX(`period_month`)
FROM
( SELECT
@ttt := IF(
`company_code`=(SELECT `company_code` FROM `range` r2 WHERE r2.`period_month`<r1.`period_month` ORDER BY `period_month` DESC LIMIT 1),
@ttt,
@ttt+1) iter,
`period_month`,
`company_code`
FROM `range` r1
WHERE emp_code = 'NIK001'
ORDER BY period_month ASC
) subreq
GROUP BY iter
;
Это использует результат внутреннего запроса, во внешнем запросе. Это дает мне, с моими данными испытаний,
company_code MIN(`period_month`) MAX(`period_month`)
Alpha 1 3
Beta 4 6
Alpha 7 10
Если вам нужно ограничить выбор строк, сделайте это в предложении where в запросе inner , иначе вся база данных будет загружаться в память при каждом запросе. Другая проблема заключается в том, что внутренний запрос извлекает предыдущую запись как «запись с ближайшим нижним значением period_month
. В результате вы должны не сортировать внутренний запрос по чему-либо, кроме period_month ASC
. если хотите, можете сортировать вещи во внешнем запросе.
Наконец, , если по какой-то причине вы используете старый интерфейс mysql_query
, вам нужно поместить строку SET
в отдельный запрос, поскольку он может обрабатывать только один запрос за раз .
mysql_query("SET @ttt = 0;");
$rs=mysql_query("SELECT `company_code`,MIN(`period_month`),MAX(`period_month`)
FROM
( SELECT
@ttt := IF(
`company_code`=(SELECT `company_code` FROM `range` r2 WHERE r2.`period_month`<r1.`period_month` ORDER BY `period_month` DESC LIMIT 1),
@ttt,
@ttt+1) iter,
`period_month`,
`company_code`
FROM `range` r1) subreq
GROUP BY iter
;");
Не уверен, насколько хорошо этот метод работает при масштабировании до больших баз данных, но он определенно работает. Может быть, есть «хороший» способ. Просто убедитесь, что вы случайно не напутали что-то в запросе, если вы не до конца понимаете это. :)