2014-01-23 4 views
0

Рассмотрите таблицу Пользователи с столбцами Идентификатор, имя, фамилия и таблица Действия со столбцами Ip и Actor. Мне нужно получить для каждого 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 неизвестно в пункте где во внутреннем подзапроса.

Выполнение проблем с производительностью, мне нужно избегать использования 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

Смежные вопросы