2017-12-01 2 views
1

次のMySQLクエリがあります。 user_extraテーブルは、指定されたuser_idに対して複数の値を返すことができます。私はuser_extraの最新のa.session_date値だけを希望します。MySQLサブクエリはJOINテーブルから最新の値のみを取り出します

SELECT DISTINCT (user_id) user_id, a.value 
FROM user_reg ap 
JOIN user_extra a USING (user_id) 
WHERE ap.session_date BETWEEN '2017-01-01' AND '2017-06-10' AND a.session_date<='2017-01-01' 

どうすればいいですか?

答えて

0
select ap.user_id, ap1.value 
from user_reg ap 
inner join (
    select user_id, max(session_date) as MaxDate, value 
    from user_extra 
    group by user_id 
) ap1 on ap.user_id = ap1.user_id and ap.date = ap1.MaxDate 

シングルユーザーIDの最大セッション日を指定します。

+0

これで選択された別名が削除されました。どうすればuser_idにdistinctを保持できますか? – Ahmed

+0

私はそれを考え出しました。私はDISTINCT句をselectに追加しました。内側のjoin selectのuser_idでは、useridに変更しました。それがうまくいきました。 – Ahmed

0

1つの方法は、最新のレコードを検出するサブクエリに結合することです。これはおそらくMySQLが分析関数を利用できないのでここに行く最良の方法です。この場合、クエリに1つ以上の結合を追加して、user_extraテーブルを各ユーザーの最新のセッションに対応するレコードに制限することができます。

SELECT 
    ur.user_id, 
    ue1.value 
FROM user_reg ur 
INNER JOIN user_extra ue1 
    ON ur.user_id = ue1.user_id AND 
     ue1.session_date <= '2017-01-01' 
INNER JOIN 
(
    SELECT user_id, MAX(session_date) AS max_session_date 
    FROM user_extra 
    GROUP BY user_id 
) ue2 
    ON ue1.user_id = ue2.user_id AND 
     ue1.session_date = ue2.max_session_date 
WHERE 
    ur.session_date BETWEEN '2017-01-01' AND '2017-06-10'; 
0

ユーザー・利用のすべての値の一覧を取得したい場合:

SELECT A.user_id, SUM(B.value) SUM_OF_VALUES FROM 
(SELECT user_id, value FROM user_reg 
WHERE session_date BETWEEN '2017-01-01' AND '2017-06-10' 
GROUP BY user_id, value) A INNER JOIN 
(SELECT user_id, MAX(session_date) FROM user_extra 
WHERE session_date<='2017-01-01' GROUP BY user_id) B 
ON A.user_id=B.user_id 
GROUP BY A.user_id; 
:ユーザー使用の合計値を取得したい場合でも、

SELECT A.user_id, GROUP_CONCAT(B.value) LIST_OF_VALUES FROM 
(SELECT user_id, value FROM user_reg 
WHERE session_date BETWEEN '2017-01-01' AND '2017-06-10' 
GROUP BY user_id, value) A INNER JOIN 
(SELECT user_id, MAX(session_date) FROM user_extra 
WHERE session_date<='2017-01-01' GROUP BY user_id) B 
ON A.user_id=B.user_id 
GROUP BY A.user_id; 

関連する問題