MySQL5只按一列过滤重复项

tjvv9vkg  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(273)

使用mysql 5,因为gcloud只支持。。。
我试图从查询中筛选出具有重复文本列的标记,并找到了一种方法,使用row\u 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;

还有什么我可以用的吗?我甚至不知道这个方法是否有效,因为我无法运行它。

dy2hfwbg

dy2hfwbg1#

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

相关问题