2016-12-16 4 views
0

だから私は同じメールアドレス、パスワード、その他の情報(ええ、悪い実装、質問しないでください)で私のウェブサイトで行われたユーザーアカウントを返すクエリがあります。これは、別のプログラムからユーザーIDを取得することによって行われます。COUNT UNIONが多すぎます

私のSQLは、あなたが、私はこれらの重複したユーザーアカウントのそれぞれが持っているどのように多くの罰則カウントしようと列を持っていることに気づくでしょう

SELECT * 
FROM 
    (SELECT usuario.id as 'user_id', 
      concat(usuario.nombre, ' ', usuario.apellidos) AS 'user_full_name', 
      usuario.email 'user_email', 
         LEFT(usuario.date_created, 19) AS 'user_date_created', 
         LEFT(usuario.last_updated, 19) AS 'user_last_updated', 
         CASE 
          WHEN usuario.status = 10 THEN 'Banned' 
          ELSE 'Active' 
         END AS 'status', 
         'Mismos datos' AS duplicate_type, 
         CASE 
          WHEN usuario.es_broker=0 THEN 'Consumer' 
          WHEN usuario.es_tm=1 THEN 'TM' 
          ELSE 'Broker' 
         END AS 'user_type', 
         COUNT(DISTINCT penalizacion.id) AS 'penalty_count' 
    FROM usuario 
    JOIN penalizacion ON usuario.id = penalizacion.vendedor_id 
    WHERE usuario.password = 
     (SELECT usuario.password 
     FROM usuario 
     WHERE usuario.id = {USUARIO_DUPE}) 
    UNION SELECT usuario.id as 'user_id', 
       concat(usuario.nombre, ' ', usuario.apellidos), 
       usuario.email, 
       LEFT(usuario.date_created, 19), 
       LEFT(usuario.last_updated, 19), 
       CASE 
        WHEN usuario.status = 10 THEN 'Dado de baja' 
        ELSE 'Activo' 
       END AS 'status', 
       'Mismo móvil' AS duplicate_type, 
       CASE 
        WHEN usuario.es_broker=0 THEN 'Consumer' 
        WHEN usuario.es_tm=1 THEN 'TM' 
        ELSE 'Broker' 
       END AS 'user_type', 
       COUNT(DISTINCT penalizacion.id) AS 'penalty_count' 
    FROM usuario 
    JOIN penalizacion ON usuario.id = penalizacion.vendedor_id 
    WHERE usuario.numero_movil = 
     (SELECT usuario.numero_movil 
     FROM usuario 
     WHERE usuario.id = {USUARIO_DUPE}) 
    UNION SELECT usuario.id as 'user_id', 
       concat(usuario.nombre, ' ', usuario.apellidos), 
       usuario.email, 
       LEFT(usuario.date_created, 19), 
       LEFT(usuario.last_updated, 19), 
       CASE 
        WHEN usuario.status = 10 THEN 'Dado de baja' 
        ELSE 'Activo' 
       END AS 'status', 
       'Mismo email' AS duplicate_type, 
       CASE 
        WHEN usuario.es_broker=0 THEN 'Consumer' 
        WHEN usuario.es_tm=1 THEN 'TM' 
        ELSE 'Broker' 
       END AS 'user_type', 
       COUNT(DISTINCT penalizacion.id) AS 'penalty_count' 
    FROM usuario 
    JOIN penalizacion ON usuario.id = penalizacion.vendedor_id 
    WHERE usuario.email = 
     (SELECT usuario.email 
     FROM usuario 
     WHERE usuario.id = {USUARIO_DUPE}) 
    UNION SELECT usuario.id, 
       concat(usuario.nombre, ' ', usuario.apellidos), 
       usuario.email, 
       LEFT(usuario.date_created, 19), 
       LEFT(usuario.last_updated, 19), 
       CASE 
        WHEN usuario.status = 10 THEN 'Dado de baja' 
        ELSE 'Activo' 
       END AS 'status', 
       'Misma tarjeta principal' AS duplicate_type, 
       CASE 
        WHEN usuario.es_broker=0 THEN 'Consumer' 
        WHEN usuario.es_tm=1 THEN 'TM' 
        ELSE 'Broker' 
       END AS 'user_type', 
       COUNT(DISTINCT penalizacion.id) AS 'penalty_count' 
    FROM usuario 
    JOIN penalizacion ON usuario.id = penalizacion.vendedor_id 
    WHERE usuario.main_credit_card_id = 
     (SELECT usuario.main_credit_card_id 
     FROM usuario 
     WHERE usuario.id = {USUARIO_DUPE}) 
    ORDER BY status DESC) A 
GROUP BY user_id 

です。しかし、その代わりに、 "penalty_count"の列は、私が探している重複のユーザーのIDと実際の重複のペナルティの数のペナルティの数を合計するようです。

COUNT counts too much when UNIONing

ので、代わりの取得は、私はすべてのコメントにこの

wished result of COUNT is ok

+0

あまりにも大きな問題です。それを最小化! – jarlh

+0

jarlhと同意します。あなたのSQLクエリはあなたの問題が他の誰かによって解決されるには大きすぎます。最小の問題を最小限に抑えるようにしてください(同じユーザーのメールの件数を取得しようとしています) – DeadEye

+0

UNIONクエリ内のGROUP BY句はどこにありますか? 1つを引き出し、それを自分の上で実行して、それが何をしているのかを確認します。見た目では、それぞれの個別の値ではなく、各行ごとに効果的に1を入れることができます。しかし、あなたのデータを見ることなく教えるのは難しいです。 –

答えて

0

感謝を取得します。私は何を考えていたのか分かりません。問題を特定してから、より簡潔な質問をして再度尋ねます。ありがとう!

関連する問題