クエリで少し助けが必要です。
SELECT id,email FROM user_info WHERE username!=''
AND email='example@gmail.com'
GROUP BY email ORDER BY id DESC LIMIT 1
これが現在行うことは、個別のメールを取得することですが、このメールの下にあるアカウントの最新の ID を取得することではありません。
クエリで少し助けが必要です。
SELECT id,email FROM user_info WHERE username!=''
AND email='example@gmail.com'
GROUP BY email ORDER BY id DESC LIMIT 1
これが現在行うことは、個別のメールを取得することですが、このメールの下にあるアカウントの最新の ID を取得することではありません。
フィールドに集計を適用するid
と、各メールの最新の ID が返されるようです。
SELECT Max(id), email
FROM user_info
WHERE username!=''
AND email='example@gmail.com'
GROUP BY email
残念ながら、GROUP BY
集計なしでを適用id
すると、最大値を選択するように指定しない限り、何が返されるかは保証されません。
に関連付けられているユーザー名を返したい場合はmax(id)
、サブクエリを使用できます。
SELECT i.MaxId,
i.email,
u.username
FROM user_info u
inner join
(
select max(id) MaxId, email
from user_info
WHERE username!=''
AND email='example@gmail.com'
group by email
) i
on u.id = i.maxid
and u.email = i.email
WHERE username!=''
AND email='example@gmail.com';
「最新のID」が最大値を意味する場合、MySQLユーザー変数を使用して前の行の値を保持する1つのアプローチを使用して、比較を行うことができます。
SELECT IF(u.email=@prev_email,1,0) AS dup_email_ind
, u.id
, u.username
, @prev_email := u.email AS email
FROM user_info u
CROSS
JOIN ( SELECT @prev_email := NULL) i
WHERE u.username != ''
AND u.email = 'example@gmail.com'
GROUP
BY u.email DESC
, u.id DESC
, u.username DESC
これにより、すべての行が返され、その行が古い「重複した」電子メールと見なされるかどうかが示されます。dup_email_ind = 1
古い重複として識別された行dup_email_ind
=0は、この行が特定の電子メール値の最新の行(id値が最大の行)であることを示します。
(通常、このような重複を探しているときは、「重複」している行の両方またはすべてを返すと便利です。)
「最新のID」を持つ行のみを返すには、上記のクエリを(インラインビューとして)別のクエリでラップします。クエリからの出力は、外部クエリの行ソースとして使用されます。)
SELECT d.*
FROM (
-- the query above gets put here
) d
WHERE d.dup_mail_ind = 0
もう1つのアプローチは、SELECTリストで相関サブクエリを使用することですが、これは実際には小さなセットを返す場合にのみ適しています。(このアプローチでは、大規模なセットで深刻なパフォーマンスの問題が発生する可能性があります。)
SELECT ( SELECT u1.id
FROM user_info u1
WHERE u1.email = e.email
AND u1.username != ''
ORDER BY u1.id DESC
LIMIT 1
) AS id
, ( SELECT u2.username
FROM user_info u2
WHERE u2.email = e.email
AND u2.username != ''
ORDER BY u2.id DESC
LIMIT 1
) AS username
, e.email
FROM ( SELECT u.email
FROM user_info u
WHERE u.email = 'example@gmail.com'
AND u.username != ''
GROUP BY u.email
) e