Выполните mysql левое соединение на наборе результатов внутреннего соединения - PullRequest
1 голос
/ 01 января 2012

Таблица

AID    PID  UID   
214    212  1009
213    212  1004
212    212  1002
211    210  1004
210    210  1003

Таблица F

UID    FID
1000   1002
1002   1000
1000   1003
1003   1000
1000   1009
1009   1000
1009   1003
1003   1009
1004   1002
1002   1004

Я могу выполнить внутреннее объединение для этих таблиц, как это, чтобы получить AID и PID из таблицы для каждого FID пользователя, который можетполучить из таблицы F.Предположим, мой ID ID 1000, тогда для меня действия, выполненные моими друзьями, будут

SELECT AID,PID from A inner join F on A.UID = F.FID where F.UID = '1000';

, а результат будет

AID   PID
214   212
212   212
210   210

Мне нужно, чтобы PID появлялся только один раз, независимо от того, какойUID это относится к.Также мне нужен PID с максимальным AID, связанным с ним.

Если попытаться сделать это, используя group by

SELECT AID,PID from A inner join F on A.UID = F.FID where F.UID = '1000'
 GROUP BY PID;

, я получу

AID   PID
212   212
210   210

Я хочу, чтобы результат был

AID   PID
214   212
210   210

Также я хочу выполнить это, используя левое соединение, т.е. левое соединение с набором результатов предыдущего внутреннего объединенного результата.Причина, по которой я прочитал, что левое соединение выполняется быстрее по группам.Пожалуйста, постарайтесь быть эффективными с вашими запросами, так как в таблице содержится более 1,5 тыс. Кортежей, а в таблице F уже более 5000 кортежей.Они будут резко расти, как и в будущем.

Ответы [ 2 ]

1 голос
/ 01 января 2012

Попробуйте это:

SELECT * 
FROM (
  SELECT AID, PID
  FROM A
  INNER JOIN F ON A.UID = F.FID
  WHERE F.UID = '1000'
  ORDER BY AID DESC 
) AS t
GROUP BY PID

// РЕДАКТИРОВАТЬ

Упрощенная версия:)

SELECT MAX( AID ) AS AID , PID
FROM A
INNER JOIN F ON A.UID = F.FID
WHERE F.UID = '1000'
GROUP BY PID
0 голосов
/ 01 января 2012

Попробуйте это:

select MAX(A.AID),PID 
from A left join F on (A.UID=F.FID) 
where F.UID=1000 
group by PID;

.. о, я вижу, что @piotrekkr думал об этом только передо мной :) единственная разница в том, что LEFT JOIN.

Если вам также нужны другие столбцы, соответствующие MAX, вы должны использовать объединение таблицы A с самим собой:

SELECT A.AID, A.PID, F.FID -- etc.
FROM A
LEFT JOIN A A2
 ON A.PID=A2.PID AND A.AID<A2.AID
LEFT JOIN F  -- may want to inner join here, up to you
 ON A.UID=F.FID
WHERE F.UID=1000
AND A2.AID IS NULL;

THE A LEFT JOIN A A2 ON A.PID=A2.PID AND A.AID<A2.AID WHERE A2.AID IS NULL является ключевой частью - он соединяет таблицу A с самим собой в каждом PID (это GROUP BY PID в исходном запросе) и дополнительно требует, чтобы AID было меньше, чем A2.

Поскольку это левое соединение, если в A есть AAID, такой, что для этого PID нет большего AID (в A2), то A2.AID будет иметь значение NULL. Это как раз максимальная помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...