2014-01-23 119 views
0

考慮一個表具有列Id,Name,Surname和一個表的用戶具有列Ip和Actor的Actions。我需要爲每個Ip檢索使用該Ip執行操作的用戶組。 我現在的樣子:mysql - 用子查詢重寫查詢

SELECT a.ip, (
    SELECT GROUP_CONCAT(t.id, '-', t.name, ' ', t.surname) FROM(
     SELECT ud.id, ud.name, ud.surname 
    FROM users_data AS ud 
    JOIN actions AS a2 ON a2.actor = ud.id 
    WHERE a2.ip = a.ip 
    GROUP BY ud.id) AS t 
    ) 
    FROM actions AS a 
WHERE a.ip != '' AND a.ip != '0.0.0.0' 
GROUP BY a.ip 

它不起作用,因爲a.ip在內部子查詢的WHERE子句中是未知的。

對於性能問題,我需要避免使用DISTINCT。

有什麼建議嗎?

+0

埃爾默,不應該是'wetwieve'嗎? – Strawberry

回答

0

我解決它使用此查詢(仍然相當緩慢,所以還是有空間的改進...):

SELECT SQL_NO_CACHE t.ip, COUNT(t.id) AS c, GROUP_CONCAT(t.id, '-', t.name, ' ', t.surname, '-', t.designerAt > 0) FROM ( 
    SELECT a.ip, ud.id, ud.name, ud.surname, u.designerAt 
    FROM actions AS a 
    JOIN users_data AS ud ON ud.id = a.actor 
    JOIN users AS u ON u.id = a.actor 
    WHERE a.ip != '' 
    AND a.ip != '0.0.0.0' 
    AND a.actor !=0 
    GROUP BY a.ip, a.actor 
    ) AS t 
GROUP BY t.ip 
0

你有沒有試過在子查詢之外寫入條件a2.ip = a.ip? 即在外部查詢的where子句中!

+0

它沒有多大意義。其實表中的a2在外部未知,其中 – marcosh

+0

@marcosh ..請參考我的最新答案! –

1

你可以重寫查詢爲

SELECT n.ip, GROUP_CONCAT(DISTINCT n.your_user SEPARATOR ' -- ') `users` FROM 
( 
    SELECT a.ip AS ip, CONCAT(t.id, '-', t.name, ' ', t.surname) `your_user` 
    FROM users_data AS ud 
    JOIN actions AS a ON a.actor = ud.id   
) `new_table` n 
WHERE n.ip != '' AND n.ip != '0.0.0.0' 
GROUP BY n.ip 

注意注意的是,結果被截斷在由group_concat_max_len系統變量給出的最大長度 ,其中 有1024年的默認值

+0

這個解決方案不是複製用戶嗎?我的意思是,如果用戶對同一個Ip執行更多操作,它應該只是一個 – marcosh

+0

@marcosh查看我的更新回答'GROUP_CONCAT(DISTINCT n.your_user SEPARATOR' - ')' –

+0

好的,這是有效的。我問是否有可能通過使用DISTINCT獲得解決方案 – marcosh