MySQL 5仅按一列过滤重复项

时间:2018-11-14 00:23:12

标签: mysql sql

使用mysql 5,因为gcloud仅支持...

我正在尝试从查询中过滤出带有重复的 text 列的标签,并找到了一种使用ROW_NUMBER()和OVER()子句来选择第一个(通过id)具有重复文本的标签的标签,但由于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 :(得分:0)

您可以使用相关子查询来获取具有最小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