筛选重复的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时,都会出现一个错误。最终,它工作得非常完美!非常感谢。如果我只让它返回每张发票的最大发票小时数会怎么样?