1

クエリで少し助けが必要です。

SELECT id,email FROM user_info WHERE username!='' 
     AND email='example@gmail.com' 
     GROUP BY email ORDER BY id DESC LIMIT 1

これが現在行うことは、個別のメールを取得することですが、このメールの下にあるアカウントの最新の ID を取得することではありません。

4

2 に答える 2

2

フィールドに集計を適用する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';
于 2013-02-11T21:21:39.790 に答える
-1

「最新の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
于 2013-02-11T21:53:18.193 に答える