2016-12-16 55 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

感謝所有的評論。我不知道我在想什麼。我會試着找出問題,然後用更簡潔的問題再問一次!謝謝!