2014-06-22 35 views
-2

我使用此查詢彙總表export_blocks,由用戶和日期彙總的內容,並將其保存爲一個新表:生成索引列「ORDER BY X,Y」

CREATE TABLE export_days 
SELECT user_id DATE(submitted) AS date_str, 
FROM export_blocks 
GROUP BY user_id, DATE(submitted) 
ORDER BY user_id, submitted 

我怎樣才能爲每個user_id獲得該用戶記錄日期的增量索引?按照ORDER BY,每個用戶的標記應從1開始。即我想生成SQL使用下面的輸出date_index

user_id date_str date_index 
brian 2014-06-10 1 
brian 2014-06-12 2 
brian 2014-06-15 3 
louis 2014-06-08 1 
louis 2014-06-16 2 
lucy 2013-11-15 1 
(etc...) 

我一直試圖https://stackoverflow.com/a/5493480/1297830,但我無法得到它的工作。它會過早停止計數器,因此id_nodate_no的數字太小。

+0

您的問題尚不清楚。你究竟想達到什麼目的? –

+0

顯示您的實際查詢,包括'group by' –

+0

我已更新問題。我希望現在更清楚。 –

回答

0

基於Joachim的出色答案,我制定瞭解決方案。它也適用於每個用戶每天有多行的情況。

CREATE TABLE export_days 
SELECT 
    user_id, DATE(submitted) AS date_str, 
    (SELECT COUNT(DISTINCT DATE(submitted))+1 FROM export_blocks WHERE user_id = a.user_id AND submitted < a.submitted) date_no 
FROM export_blocks a 
GROUP BY user_id, DATE(submitted) 
ORDER BY user_id, submitted 
1

根據您的示例查詢,您可以執行簡單(從屬)子查詢來獲取結果;

SELECT id, date_str, 
    (SELECT COUNT(DISTINCT id)+1 FROM mytable WHERE id < a.id) id_no, 
    (SELECT COUNT(id)+1 FROM mytable WHERE id = a.id AND date_str < a.date_str) date_no 
FROM mytable a 
ORDER BY id; 

......或者你可以做一些自我連接;

SELECT a.id, a.date_str, 
    COUNT(DISTINCT b.id)+1 id_no, 
    COUNT(DISTINCT c.date_str)+1 date_no 
FROM mytable a 
LEFT JOIN mytable b ON a.id > b.id 
LEFT JOIN mytable c ON a.id = c.id AND a.date_str > c.date_str 
GROUP BY a.id, a.date_str 
ORDER BY a.id, a.date_str; 

An SQLfiddle showing both in action。不幸的是,這兩種解決方案都不是真正的高性能解決方案,但是由於MySQL缺乏分析性(即排名)功能,因此選項是有限的。使用用戶變量來進行排名也是一種選擇,但是它們使用起來非常棘手並且不便攜,所以只有在性能要求時纔會去那裏。

+0

謝謝你,約阿希姆。這絕對看起來像要走的路。性能不是問題,我只需要做一次。我不太瞭解''FROM mytable a''語法。在子查詢之外的「外部名字空間」中,「a」是對「mytable」當前行的引用嗎? –

+0

@Jonas在子查詢版本中,'a'只是外層查詢中'mytable'的別名。這允許內部查詢引用'a.id',以便它知道它當前應該使用哪一行。如果我們沒有別名並在內部查詢中使用'mytable.id',它將被內部查詢自己的'mytable'隱藏。 –