过滤重复MySQL

时间:2017-01-25 18:06:15

标签: mysql

我不确定解释问题的最佳方法。 我有一张类似于这个的表

+---------+------------+---------------+--+
| user_id | invoice_no |  invoiced_hrs |  |
+---------+------------+---------------+--+
|    1    |    1023    |    8.1234     |  |
|    2    |    1023    |    1.1234     |  |
|    1    |    1023    |    5.8765     |  |
|    4    |    1085    |    6.7654     |  |
|    4    |    1085    |    7.5435     |  |
|    6    |    1022    |    5.6789     |  |
+---------+------------+---------------+--+

我需要能够过滤我的查询,而不必将多个user_id与任何invoice_no相关联。只要只有一个user_id与之关联,重复的发票号就可以了。

我尝试做的只是保留发票上占大部分时间的用户的行。

2 个答案:

答案 0 :(得分:0)

您可以这样做:

SELECT *
FROM table t
WHERE t.user_id = (SELECT t2.user_id
               FROM table t2
               GROUP BY t2.user_id
               ORDER BY SUM(t2.invoiced_hrs) DESC
               LIMIT 1)

这将使用户的所有行都有更多的小时开票。 在您的示例中:

|    4    |    1085    |    6.7654     |  |
|    4    |    1085    |    7.5435     |  |

请注意,内部查询将返回以下内容:

|    4    |   14.3089    |  |

答案 1 :(得分:0)

试试这个:

select
    t.*
from your_table t
inner join (
    select
        invoice_no,
        user_id,
        sum(invoiced_hrs) invoiced_hrs
    from your_table
    group by invoice_no, user_id
) t1 on t.invoice_no = t1.invoice_no and t.user_id = t1.user_id
inner join (
    select 
        invoice_no,
        max(invoiced_hrs) invoiced_hrs
    from (
        select
            invoice_no,
            user_id,
            sum(invoiced_hrs) invoiced_hrs
        from your_table
        group by invoice_no, user_id
    ) t group by invoice_no
) t2 on t1.invoice_no = t2.invoice_no and t1.invoiced_hrs = t2.invoiced_hrs;

产地:

+---------+------------+--------------+
| user_id | invoice_no | invoiced_hrs |
+---------+------------+--------------+
|       6 |       1022 |       5.6789 |
|       1 |       1023 |       8.1234 |
|       1 |       1023 |       5.8765 |
|       4 |       1085 |       6.7654 |
|       4 |       1085 |       7.5435 |
+---------+------------+--------------+
5 rows in set (0.04 sec)

它获取invoice_no的user_id,其中包含总invoiced_hrs中的最大部分。

请注意,如果用户贡献的话,它会返回两个用户。