Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
筛选重复的MySQL_Mysql - Fatal编程技术网

筛选重复的MySQL

筛选重复的MySQL,mysql,Mysql,我不确定用什么最好的方式来解释我的问题。 我有一张类似的桌子 +---------+------------+---------------+--+ | user_id | invoice_no | invoiced_hrs | | +---------+------------+---------------+--+ | 1 | 1023 | 8.1234 | | | 2 | 1023 | 1.1234 | |

我不确定用什么最好的方式来解释我的问题。 我有一张类似的桌子

+---------+------------+---------------+--+
| 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     |  |
+---------+------------+---------------+--+
我需要能够筛选我的查询,而无需将多个用户id与任何发票号关联。只要只有一个用户id与发票号关联,重复的发票号就可以了


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

您可以这样做:

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    |  |
试试这个:

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)
它获取发票号的用户id,该发票号在总发票小时数中的最大部分


请注意,如果两个用户的贡献相等,它将返回两个用户。

请添加所需的结果。
按用户id分组。
?“我试图做的是只保留发票上拥有大部分小时数的用户的行。”-您需要求和,然后从中获得最大值。这正是我需要的!然而,由于某种原因,我得到了一个接近极限的语法错误。@nadleeh如果你想要一个错误的答案,这正是你所需要的。@GurV我的意思是,输出就是我所需要的。当我尝试使用这个时,仍然会得到一个错误。但我得出的结论是,每当我尝试使用order by时,都会出现一个错误。最终,它工作得非常完美!非常感谢。如果我只让它返回每张发票的最大发票小时数会怎么样?