Фильтр MySQL 5 дублирует только один столбец - PullRequest
0 голосов
/ 14 ноября 2018

Использование mysql 5, потому что gcloud поддерживает только это ...

Я пытаюсь отфильтровать теги с повторяющимся столбцом text из запроса и нашел один способ сделать это, используя ROW_NUMBER () и предложение OVER (), чтобы выбрать первое (по идентификатору). ) тег тегов с дублированным текстом, но я получаю синтаксическую ошибку, потому что в mysql 5 не существует over. *

SELECT 
  c.*,
  CONCAT('[',
    GROUP_CONCAT(CONCAT('{"id":',
      t.id,
      ', "company_id":',
      t.company_id,
      ', "client_id":',
      t.client_id,
      ', "user_id":',
      t.user_id,
      ', "text":"',
      t.text,
      '", "color":"',
      t.color,
    '"}')
  ORDER BY t.id),
  ']') AS tags
FROM
  company_users AS cu
    LEFT JOIN
  companies AS c ON cu.company_id = c.id
    LEFT JOIN
  (SELECT t.*, ROW_NUMBER() OVER(PARTITION BY `text` ORDER BY `id` ASC) AS tagnum
    FROM client_tags AS t
  ) t ON c.id = t.company_id AND tagnum = 1
WHERE
  # temp
  cu.user_id = 1
GROUP BY c.id;

Есть ли что-то еще, что я мог бы использовать? Я даже не знаю, сработает ли этот метод, потому что я не могу его запустить.

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете использовать коррелированный подзапрос, чтобы получить совпадение с наименьшим значением id:

SELECT . . . 
FROM company_users cu LEFT JOIN
     companies c
     ON cu.company_id = c.id LEFT JOIN
     client_tags t
     ON t.company_id = c.id AND
        t.id = (SELECT MIN(t2.id)
                FROM client_tags t2
                WHERE t2.text = t.text
               )
WHERE cu.user_id = 1

Обратите внимание, что коррелированный подзапрос должен идти в предложении ON, потому что это LEFT JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...