2016-12-16 56 views
0

所以...我有一个查询,返回在我的网站上使用相同的电子邮件地址,密码和其他信息(是的,不好的实现,不要问)在我的网站上做出的用户帐户。它通过从另一个程序提供用户标识来实现。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,而不是每个不同的值。尽管没有看到你的数据,但很难说。 –

回答

0

感谢所有的评论。我不知道我在想什么。我会试着找出问题,然后用更简洁的问题再问一次!谢谢!