每次用户在同一天出现多次时都会发现复杂的MysQL查询

时间:2014-12-12 15:12:58

标签: mysql duplicates

我正在尝试查询表格。有3个重要字段:attendant_id,client_id和日期。

每次服务员与客户合作时,他们都会添加一个条目,其中包括他们的ID,客户的ID和日期。偶尔,服务员将在同一天与多个客户合作。我想捕捉这种情况发生时。以下是我到目前为止的情况:

SELECT  *
FROM    timesheet_lines tsl1
WHERE   EXISTS
(
SELECT  *
FROM    timesheet_lines tsl2
WHERE   tsl1.date = tsl2.date
AND tsl1.attendant_id = tsl2.attendant_id
AND tsl1.client_id <> tsl2.client_id
AND tsl1.date between '2014-04-01' AND '2014-06-30'
LIMIT 2,5
)

我只想显示服务员与至少2个不同客户合作的结果。我不希望一天有超过5个。这就是我使用LIMIT 2,5的原因。

我也对今年4月到6月感兴趣。

我想我可能有正确的语法,但查询似乎需要永远运行。有更快的查询吗?对于此特定日期范围,应该只有大约42000多个条目。我不希望得到超过500-600个符合标准的结果。

我最终使用了以下内容:

create TEMPORARY table tempTSL1
 (date1 date, start1 time, end1 time, attend1 varchar(50), client1 varchar(50), type1 tinyint);
insert into tempTSL1(date1, start1, end1, attend1, client1, type1)
select date, start_time, end_time, attendant_id, client_id, type
from timesheet_lines
WHERE
timesheet_lines.date BETWEEN '2014-04-01' AND '2014-06-30'
and timesheet_lines.type IN (1,2,5,6);

create TEMPORARY table tempTSL2
 (date2 date, start2 time, end2 time, attend2 varchar(50), client2 varchar(50), type2 tinyint);
insert into tempTSL2(date2, start2, end2, attend2, client2, type2)
select date, start_time, end_time, attendant_id, client_id, type
from timesheet_lines
WHERE
timesheet_lines.date BETWEEN '2014-04-01' AND '2014-06-30'
and timesheet_lines.type IN (1,2,5,6);

SELECT *
FROM tempTSL1
WHERE (attend1,date1) IN (
    SELECT attend2
        ,date2
    FROM tempTSL2 tsl2
    GROUP BY attend2
        ,date2
    HAVING COUNT(date2) > 1
)
GROUP BY attend1
    ,client1
    ,date1
HAVING COUNT(client1) = 1

ORDER BY date1,attend1,start1

1 个答案:

答案 0 :(得分:1)

你可能会使它变得比它需要的复杂得多。尝试这样的事情:

SELECT attendant_id
    ,client_id
    ,date
FROM timesheet_lines
WHERE (attendant_id,date) IN (
    SELECT attendant_id
        ,date
    FROM timesheet_lines tsl1
    GROUP BY attendant_id
        ,date
    HAVING COUNT(date) > 1
)
GROUP BY attendant_id
    ,client_id
    ,date
HAVING COUNT(client_id) = 1

子查询仅返回在同一日期执行多项活动的服务员的结果。顶部查询将从同一个表中提取,与活动的话务员和日期相匹配,并将结果集过滤到分组中只有一个客户端的项目。例如:

attendant_id            client_id            date
1                       A                    2014-01-01
1                       B                    2014-01-01
2                       C                    2014-01-01
2                       D                    2014-01-02

将返回:

attendant_id            client_id            date
1                       A                    2014-01-01
1                       B                    2014-01-01

未经测试,但我认为它应符合您的要求,假设以下两个陈述属实:

  • 你不是想在同一天捕捉两个不同的服务员在同一个客户工作
  • 服务员每天只能为每个客户执行一项活动

如果第二点不正确,那么您需要在子查询中加入其他字段(例如activity_id或其他内容)。

希望这有帮助。