首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果id已被选中,MySQL选择增量计数器

如果id已被选中,MySQL选择增量计数器
EN

Stack Overflow用户
提问于 2014-02-05 11:47:07
回答 3查看 663关注 0票数 2

我有一个非常简单的MySQL表,其结构如下:

代码语言:javascript
复制
id   | customer_id |  name  | address
-------------------------------
1    |      1      |  John  | 123 street
2    |      2      |  Jane  | 456 lane
3    |      1      |  John  | 789 square
4    |      1      |  John  | 000 street
5    |      3      |  Paul  | 666 hell

每个客户可以有多个地址,我想选择所有地址,并为每个ID设置一个递增计数器,如下所示:

代码语言:javascript
复制
id   | customer_id |  address   |    count_by_id
----------------------------------------------------
1    |      1      | 123 street |  John's address #1
2    |      2      | 456 lane   |  Jane's address #1
3    |      1      | 789 square |  John's address #2
4    |      1      | 000 street |  John's address #3
5    |      3      | 666 hell   |  Paul's address #1

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-05 11:59:06

  1. 您可以使用子查询来获取具有与当前地址相同的 customer_id的地址数,但id小于当前地址的。 假设您的表(或视图)名为address_table。然后: 选择a.id,a.customer_id,a.name,a.address,(从address_table选择计数(*),其中customer_id=a.customer_id和id
  2. 另一个较难理解但仍然有效的解决方案是使用JOIN+GROUPBY: 看看草莓的答案。
票数 0
EN

Stack Overflow用户

发布于 2014-02-05 12:04:42

代码语言:javascript
复制
SELECT x.*
     , COUNT(*) rank 
  FROM customer_address x 
  JOIN customer_address y 
    ON y.customer_id = x.customer_id 
   AND y.customer_address_id <= x.customer_address_id 
 GROUP 
    BY x.customer_id
     , x.customer_address_id 
 ORDER 
    BY customer_address_id;

如果性能是个问题,我们可以讨论这个问题(或者只是看看@kickstart的答案)。

票数 1
EN

Stack Overflow用户

发布于 2014-02-05 12:03:29

没有测试,但是下面有两种方法。

首先,使用序列号来计数数值。

代码语言:javascript
复制
SELECT id, customer_id, address, CONCAT(name, "'s address #", addr_seq)
FROM 
(
    SELECT id, customer_id, name, address, @counter:=IF(@prev_customer_id = customer_id, @counter + 1, 1) AS addr_seq, @prev_customer_id := customer_id
    FROM address_table
    CROSS JOIN (SELECT @counter:= 0, @prev_customer_id:=0) Sub1
    ORDER BY customer_id, id
) Sub2
ORDER BY id

或使用联接和计数

代码语言:javascript
复制
SELECT id, customer_id, address, CONCAT(name, "'s address #", addr_seq)
FROM 
(
    SELECT a.id,a. customer_id, a.address, COUNT(b.id) AS addr_seq
    FROM address_table a
    INNER JOIN address_table b
    WHERE a.customer_id = b.customer_id
    AND a.id >= b.id
    GROUP BY a.id,a. customer_id, a.address
) Sub1
ORDER BY id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21576397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档