我正在尝试查询表格。有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
答案 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
或其他内容)。
希望这有帮助。