我有一个非常简单的MySQL表,其结构如下:
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都有一个递增的计数器,如下所示:
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
我该怎么办?
答案 0 :(得分:1)
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 :(得分:0)
您可以使用子查询获取与当前地址具有相同customer_id的地址数,但ID小于当前地址。
假设您的表(或视图)名为address_table
。然后:
SELECT
a.id,
a.customer_id,
a.name,
a.address,
(SELECT count(*) FROM address_table WHERE customer_id=a.customer_id and id<a.id)+1 AS count_by_id
FROM
address_table AS a;
另一种难以理解但仍然有效的解决方案是使用JOIN + GROUPBY:
看看草莓的回答。
答案 2 :(得分:0)
未经测试,但以下2种方法。
首先使用序列号来计算值。
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
或使用加入和计数
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