如何使用ORDER BY更新此语句

时间:2016-04-01 04:58:54

标签: mysql sql-order-by

我有这组数据。

id | fullname | company | assign_num
1    sample2   company1   0000-1111
2    sample3   company2   0000-1111
3    sample4   company2   0000-1111
4    sample1   company1   0000-1111
5    sample3   company1   0000-1111

给出了assign_num。

并根据公司更新assign_num(例如公司1)     恩。     0000-1112,0000-1501,0000-1120

结果将是这样的:

id | fullname | company | assign_num
1    sample2   company1   0000-1112
2    sample3   company2   0000-1111
3    sample4   company2   0000-1111
4    sample1   company1   0000-1501
5    sample3   company1   0000-1120

使用此代码可以正常工作。

UPDATE myTable
JOIN (
  SELECT m1.id, COUNT(m2.id)+1 ord FROM myTable m1
  LEFT JOIN myTable m2 ON m1.id > m2.id AND m1.company = m2.company 
  GROUP BY m1.id
) z1 ON myTable.id = z1.id
JOIN (
  SELECT 1 ord, '0000-1112' assign_num UNION ALL
  SELECT 2 ord, '0000-1501' assign_num UNION ALL
  SELECT 3 ord, '0000-1120' assign_num
) z2
  ON z1.ord = z2.ord
SET myTable.assign_num = z2.assign_num
WHERE myTable.company = 'company1'

但我希望输出看起来像这样: (按姓名ASC排序)

id | fullname | company | assign_num
1    sample1   company1   0000-1112
2    sample3   company2   0000-1111
3    sample4   company2   0000-1111
4    sample2   company1   0000-1501
5    sample3   company1   0000-1120

1 个答案:

答案 0 :(得分:0)

SQLFiddle:http://sqlfiddle.com/#!9/b33d13/1

UPDATE myTable
JOIN (
  SELECT m1.id, 
        IF(m1.company = @company, @rank := @rank + 1, @rank := 1) as ord,
        @company := m1.company
  FROM (SELECT * FROM myTable ORDER BY company, fullname) as m1 
    CROSS JOIN (SELECT @company := NULL, @rank := 0) param
) z1
  ON myTable.id = z1.id
JOIN (
  SELECT 1 ord, '0000-1112' assign_num UNION ALL
  SELECT 2 ord, '0000-1501' assign_num UNION ALL
  SELECT 3 ord, '0000-1120' assign_num
) z2
  ON z1.ord = z2.ord
SET myTable.assign_num = z2.assign_num
WHERE myTable.company = 'company1';