2013-04-21 3 views
0

привет и извините мои плохие английские слова.Как получить данные в виде сгруппированных строк в mysql

мне нужна помощь в MySQL Query

У меня есть таблица с именем MyTable включают следующие столбцы

  1. столбец для идентификатора (автоматическое приращение).
  2. столбец для времени (в метке времени).
  3. column для данных.

Мне нужно получить данные, сгруппированных по дням и каждый день с его данными, но данные на каждый день не должен превышает 3 строки и подсчет останков строк на каждый день, и весь кол-группы не должен превышает 9 групп, как предел

(mytable) 
id | time  | data 
---------------------- 
1 | 1366553067 | data1 
2 | 1366546958 | data2 
3 | 1366546951 | data3 
4 | 1366546953 | data4 
5 | 1366546931 | data5 
6 | 1366545926 | data6 
7 | 1366564550 | data7 
8 | 1366548683 | data8 
---------------------- 
  • Примечание: // время штамп в верхней не является правильным.

Мне нужен результат, похожий на эту таблицу.

(the result table) 
time    | data | count of remains row 
----------------------------------------------- 
april 12 2013  | data1 | 3 
april 12 2013  | data2 | 3 // group one 
april 12 2013  | data3 | 3 

april 13 2013  | data7 | 0 // group two 

april 14 2013  | data8 | 0 // group three 
------------------------------------------------ 

Что я должен писать в запросе!?

Я буду очень рад за любую помощь.

+0

Что вы имеете в виду под «а все кол-групп не должна превышает 9 групп, как предел»? Что произойдет, если 12 апреля 2013 года будет 10 записей или 12 записей. Что произойдет, если 13 апреля осталось 7 оставшихся строк ?. Я также предложил бы переписать весь абзац в виде нескольких предложений. И замените временные метки датами. – koriander

+0

Почему, почему, почему-ой-*** почему *** вы храните метки времени как целые числа, а не как ... ооооо ... скажем, ['TIMESTAMP'] (https://dev.mysql.com/ док/о/datetime.html)? – eggyal

+0

Я имею ввиду, что мне нужно отображать только последние 9 дней, мне нужна моя логика программы. –

ответ

0

Следующий запрос (непроверенные) дает результат, как выходной например:

SELECT time, data, IF(totalrows.total > 3, totalrows.total - 3, 0) AS remains 
FROM (SELECT numbered.* 
    FROM SELECT ordered.*, 
       IF (id = @prev, 
        @n := @n + 1, 
        @n := 1 AND @prev := id) as position 
      FROM (SELECT mytable.* ORDER BY time) AS ordered 
      JOIN (SELECT @n := 0, @prev := id) AS setup) 
      AS numbered 
    WHERE numbered.position < 4) 
    AS  top3 
INNER JOIN (SELECT time, count(*) as total FROM mytable GROUP BY time) AS totalrows 
ON top3.time = totalrows.time 
+0

Ваш ответ кажется отличным, но я не могу его понять, потому что я начинаю в SQL –

+0

Мой код в действительности большой, поэтому, когда я применяю свой ответ в своем коде, я получаю много ошибок. –

+0

Я не в сети, дайте мне знать, если вам все еще нужна помощь и какая ошибка. – koriander