Gorm получает все уникальные по полям данные с приоритетом по другим полям - PullRequest
0 голосов
/ 07 августа 2020

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

 id label  value   client  place
  1  test  value1  a       home
  2  test  value2  a
  3  test  value3
  4  test1 value4  b
  5  test1 value5
  6  test2 value6

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

  1. если в базе данных существует значение, которое также имеет клиента и место, возьмите это
  2. , если нет, возьмите тот, если у него установлен клиент,
  3. , наконец, возьмите общий

Так что для примера выше он должен вернуть:

  id label  value  client  place
  1  test  value1  a       home
  4  test1 value4  b
  6  test2 value6

Я интересно, смогу ли я добиться этого с помощью синтаксиса gorm, я пытаюсь интегрироваться с этим:

  SELECT * FROM `mytable`ORDER BY label, client DESC, place DESC

1 Ответ

1 голос
/ 07 августа 2020

Это сложно. У меня определенно нет для вас полностью правильного ответа, поскольку я использую Oracle.

Oracle поддерживает другой синтаксис для JOIN (WHERE o. "Label" = i. "Label") , поэтому я ожидаю, что мое решение не будет работать с использованием MySQL.

Это лучшее, что я мог придумать, оно работает для меня в Oracle. Надеюсь, это поможет указать вам в правильном направлении:

SELECT m.* 
FROM MY_TABLE m
WHERE m."id" IN (
    SELECT o."id"
    FROM (SELECT DISTINCT i."id", i."label", i."client", i."place"
        FROM MY_TABLE i
        ORDER BY i."label", i."client" DESC NULLS LAST, i."place" DESC NULLS LAST) o
    WHERE m."label" = o."label" AND ROWNUM = 1
);

Логи c за подходом

  • заказать таблицу (i)
  • выберите первый «идентификатор» для каждой отдельной метки (o)
  • выберите все данные по этим идентификаторам (m)
...