【问题标题】:COUNT UNION too manyCOUNT UNION 太多
【发布时间】:2017-05-02 04:27:13
【问题描述】:

所以...我有一个查询返回在我的网站上创建的具有相同电子邮件地址、密码和其他信息的用户帐户(是的,实施不当,不要问)。它是通过从另一个程序中获取用户 ID 来实现的。

我的 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 的处罚数量与实际重复的处罚数量相加。

所以不是得到

我明白了

【问题讨论】:

  • 问题太大了。最小化它!
  • 同意 jarlh。您的 SQL 查询太大,您的问题无法由其他人解决。尝试将问题最小化(即:尝试获取同一用户电子邮件的出现次数)
  • 您的 UNION 查询中的 GROUP BY 子句在哪里?拉出一个并自己运行它,看看它在做什么。从外观上看,您可能实际上是为每一行而不是每个不同的值输入 1。但是,如果不查看您的数据,就很难判断。
  • 哇!我们已经看到了查询。这是一个QUERY!对于不熟悉您的系统的陌生人来说太大了,无法尝试解析!我可以建议您找到一个在线工具来格式化或漂亮打印此 SQL,然后您仔细检查它吗?我是否还建议您尝试消除依赖子查询(` ... WHERE something IN (SELECT something FROM ....` ) 并用 JOIN 替换它们?最后,通过将查询分解成更小的块来解决问题。

标签: mysql sql count duplicates union


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多