MySQL подзапрос - Найти только первую запись в левом соединении - PullRequest
8 голосов
/ 23 января 2012

Я пытаюсь отобразить список записей об участниках, и у меня есть несколько таблиц, которые я использую для отображения того, что мне нужно.

Это самая простая часть.Часть, с которой мне нужна помощь, связана с таблицей, в которой есть много записей для каждой записи участника: История входа

Я хочу отображать только первую строку для каждой записи участника, которая существует в таблице истории входа.В качестве альтернативы, я могу захотеть перевернуть флоп и отобразить последнюю запись в таблице истории входа.

вот что у меня получилось:

SELECT m.memberid, m.membername, m.gender, mp.phone
FROM tbl_members m, 
     tbl_members_phones mp, 
     tbl_members_addresses ma
WHERE m.defaultphoneid = mp.phoneid
AND m.defaultaddressid = ma.addressid

Так что возвращает то, чтоожидается.

2 столбца из tbl_members_login_history Я хотел бы добавить к возвращаемому результату: mh. loggedtime, mh. ipaddy

Я знаю, что добавление tbl_members_login_history поскольку LEFT JOIN будет возвращать дубликаты, я думаю, здесь должна быть необходимость в подзапросе, чтобы вернуть только 1-ю запись для этого memberid, существующего в tbl_members_login_history.

Что меня беспокоит, так это то, что если в таблице истории нет записей, я все же хочу отобразить информацию об этом члене, но оставить столбцы истории как NULL.

Это будет подзапросинцидент?и если да, то как добавить этот тип LIMIT?

Ответы [ 2 ]

20 голосов
/ 24 января 2012

Это проблема greatest-n-per-group, которая часто задается при переполнении стека.

Вот как бы я решил это по вашему сценарию:

SELECT m.memberid, m.membername, m.gender, mp.phone, mh.loggedtime, mh.ipaddy
FROM tbl_members m 
INNER JOIN tbl_members_phones mp ON m.defaultphoneid = mp.phoneid
INNER JOIN tbl_members_addresses ma ON m.defaultaddressid = ma.addressid
LEFT OUTER JOIN tbl_members_login_history mh ON m.memberid = mh.memberid
LEFT OUTER JOIN tbl_members_login_history mh2 ON m.memberid = mh2.memberid
    AND mh.pk < mh2.pk
WHERE mh2.pk IS NULL;

То есть, мы хотим, чтобы mh была самой последней строкой в ​​tbl_member_login_history для данного memberid. Поэтому мы ищем еще одну строку mh2, которая еще новее. Если не найдено ни одной более новой строки, чем строка mh, mh2.* будет иметь значение NULL, поэтому mh должно быть самой последней.

Я предполагаю, что в этой таблице есть столбец первичного ключа, который содержит растущие значения. В этом примере я предполагаю, что имя столбца pk.

Использование LEFT OUTER JOIN для обе ссылки на таблицу истории входа означают, что строка m будет сообщаться даже в том случае, если соответствующая строка отсутствует.

0 голосов
/ 24 января 2012

добавить вот так

LEFT OUTER JOIN (SELECT member_id, MAX(LAST_LOGIN_DATE) from tbl_members_login_history) Last_Login ON Last_Login.memberid = m.memberid

PS. LAST_LOGIN_DATE - псевдо столбец, вы можете попробовать ограничительный столбец

...