2014-02-05 23 views
2

我有結構如下一個非常簡單的MySQL表:MySQL的SELECT增量計數器,如果ID

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

可以用PHP做到這一點非常簡單地。 –

+1

你是否知道你的表中有明顯的冗餘? – Strawberry

回答

0
  1. 您可以使用子查詢到的地址獲取數以相同的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; 
    
  2. 另一種解決方案,這是很難理解,但仍然是有效的,是使用JOIN + GROUPBY:

    只看到草莓的答案。

+0

解決方案1完美地工作,謝謝。 – roberto06

+0

我會建議嘗試所有的解決方案,你期望有的數據。性能會有所不同,可能會顯着取決於您的實際數據。 – Kickstart

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 
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中的答案)