MySQL генерирует счетчик в реальном времени, сгруппированный по родительскому идентификатору - PullRequest
0 голосов
/ 11 марта 2011

У меня есть две таблицы:

Информация о родителе и зависимая информация

Структура таблиц следующая:

Родитель

ID   |   First   |   Last   |   DOB       |   Address
-------------------------------------------------
1    |   John    |   Doe    | 1980-01-01  |   123 street
2    |   Ryan    |   Mack   | 1974-12-12  |   444 Place

Зависимые

ParentID   |    Type   |    First   |   Last    |    DOB
--------------------------------------------------
1    |   Spouse  |    Jane    |    Doe    |   1981-02-01
1    |   Child   |    Mike    |    Doe    |   1999-08-01
1    |   Child   |    Zoe     |    Doe    |   2002-04-01
2    |   Spouse  |    Sarah   |    Mack   |   1964-01-01
2    |   Child   |    Andrew  |    Mack   |   1997-05-01

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

Таблица результатов

First   |    Last    |    Type    |    DOB        |     Address
---------------------------------------------------------------- 
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street
Ryan    |    Mack    |  Parent    |  1974-12-12   |   444 Place
Sarah   |    Mack    |   Spouse   |  1964-01-01   |   444 Place
Andrew  |    Mack    |   Child    |  1997-05-01   |   444 Place

Я могу построить приведенную выше таблицу с помощью другого пользователя SO по следующему запросу:

SELECT t.First, t.Last, t.Type, t.DOB, t.Address
FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey
                 FROM Parent
            UNION ALL
            SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
                         CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
                    FROM Dependents d
                            INNER JOIN Parent p
                                    ON d.ParentID = p.ID) t
ORDER BY t.ID, t.SortKey

Я пытаюсь решить (потенциально) большую проблему в том смысле, что мне приходится подсчитывать каждую запись для конкретного идентификатора члена на основе нескольких параметров.

Родители всегда будут 1, Супругов всегда будет 2 (если они существуют) Дети начнут с 3 и будут продолжать, пока их больше не будет (если они существуют).

Мой конечный стол будет выглядеть так:

First   |    Last    |    Type    |    DOB        |     Address  |   Count
---------------------------------------------------------------------------
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street |  1
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street |  2
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street |  3
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street |  4
Ryan    |    Mack    |  Parent    |  1974-12-12   |   444 Place  |  1
Sarah   |    Mack    |   Spouse   |  1964-01-01   |   444 Place  |  2
Andrew  |    Mack    |   Child    |  1997-05-01   |   444 Place  |  3

Я знаю, что могу установить пользовательскую переменную в начале вызова с помощью:

SET @counter: = 0;

ТО @counter: = @ counter + 1 в качестве счетчика,

но это просто продолжит подсчет до конца запроса sql, а не по ID.

Есть идеи?

1 Ответ

1 голос
/ 11 марта 2011

Вы очень близки.

SET @counter:= 0;
@counter:=@counter+1 as counter;

Почти делает то, что вы хотите, так почему бы не изменить его на:

SET @counter:= 3;
SELECT
  inner_select.first
  ,inner_select.last
  ,inner_select.Type
  ,inner_select.DOB
  ,inner_select.Address
  ,CASE WHEN inner_select.SortKey IN (1,2) 
    THEN if(@counter:= 3 = 3,inner_select.SortKey,inner_select.SortKey)
   ELSE @counter:= @counter + 1 END as SortKey
FROM
(
  SELECT t.First, t.Last, t.Type, t.DOB, t.Address  
  FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey 
        FROM Parent
  UNION ALL
  SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
    CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
  FROM Dependents d
  INNER JOIN Parent p ON d.ParentID = p.ID) t
  ORDER BY t.ID, t.SortKey 
) inner_select
ORDER BY inner_select.ID, inner_select.SortKey;

Сначала мы начнем с @counter на 3,начните считать детей.
Поскольку предыдущий выбор настолько близок, мы выбираем из , что немного настраивает результат.
if (@count:= 3 = 3,i.sk,i.sk), конечно, всегда дает inner_select.sortKey (не @counter) в результате, но вызывает сброс @ counter.

Надеюсь, это поможет.

...