首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于显示具有均匀分布值的前x条记录的SQL查询

用于显示具有均匀分布值的前x条记录的SQL查询
EN

Stack Overflow用户
提问于 2013-04-16 18:31:12
回答 1查看 431关注 0票数 1

我有一个公司联系人的数据库。每个公司在不同部门有多个联系人。每家公司都有营业额和行业数据。

我需要写一个查询,显示最近添加的前10个联系人(unix时间戳),但我不希望它是所有的营销联系人(即使前10个是),我想查看前100名,并从不同部门获得10个联系人。因此,不是前10名都是营销人员,而是2名营销人员,2名I.T人员,2名人力资源人员,2名人员。

我的问题基本上是这样的:

代码语言:javascript
复制
SELECT DISTINCT `surname`, `job_title`, `company_name`
FROM (`company_database`)
WHERE `employee_code` IN ('6', '7', '8', '9', '10', '11', '12', '13')
AND `turnover_code` IN ('5', '6', '7', '8')
AND `contact_code` IN ('16', '17', '26', '27', '9', '10', '30', '31', '23', '24', '12', '13')     AND `industry_code` NOT IN ('22', '17', '35', '36') LIMIT 10

但这只返回一个唯一的行。我需要的是每个公司一个联系人和不超过1个contact_code类型。我也只想返回10行,但很明显,要获得每行每个联系人代码的1,查询将需要查看超过10行。

仅仅在一个查询中这是可能的吗?或者,我是否应该通过编程来应用减少查询结果所需的逻辑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-16 19:49:16

您可以使用myisam引擎和一个技巧来处理临时表。

如果您创建以下临时表:

代码语言:javascript
复制
create table tmp_company_sequence
(  surname varchar(255)
  ,job_title varchar(255)
  ,company_name varchar(255)
  ,date_added date
  ,contact_code int
  ,counter int auto_increment
  ,primary key (contact_code,counter)
);

现在

代码语言:javascript
复制
insert into `tmp_company_sequence`( `surname`, `job_title`, `company_name`,`contact_code`,`date_added`)
SELECT DISTINCT `surname`, `job_title`, `company_name`,`contact_code`,`date_added`
FROM (`company_database`)
WHERE `employee_code` IN ('6', '7', '8', '9', '10', '11', '12', '13')
AND `turnover_code` IN ('5', '6', '7', '8')
AND `contact_code` IN ('16', '17', '26', '27', '9', '10', '30', '31', '23', '24', '12', '13')     AND `industry_code` NOT IN ('22', '17', '35', '36')
order by contact_code, added_date desc;

现在,您的临时工作台将通过计数器容纳所有触点。对于同一contact_code的每个触点,计数器都会增加。因此,具有特定联系人代码的最新联系人的counter = 1,下一个最近的联系人的counter =2,依此类推。

你现在可以做一个

代码语言:javascript
复制
select * 
from tmp_company_sequence 
order by counter asc, date_added desc 
limit 10;

这将为您提供在所有contact_codes上添加的最新联系人的列表。

编辑:

我刚刚意识到这可以用一个查询来完成,但它更丑陋:

代码语言:javascript
复制
SELECT `surname`
  , `job_title`
  , `company_name`
  , `contact_code`
FROM(
  SELECT  
    `surname`
    , `job_title`
    , `company_name`
    , `contact_code`
    , `date_added` 
    , IF(contact_code = @prev_contact_code,@i:=@i+1,@i:=1) AS counter
    , @prev_contact_code = contact_code
  FROM
    (`company_database`)
    ,(SELECT @i := 1) 
  WHERE `employee_code` IN ('6', '7', '8', '9', '10', '11', '12', '13') 
    AND `turnover_code` IN ('5', '6', '7', '8') 
    AND `contact_code` IN (
      '16'
      , '17'
      , '26'
      , '27'
      , '9'
      , '10'
      , '30'
      , '31'
      , '23'
      , '24'
      , '12'
      , '13'
    ) 
    AND `industry_code` NOT IN ('22', '17', '35', '36') 
  ORDER BY contact_code
    , added_date DESC) sub
WHERE counter = 1
ORDER BY added_date DESC
LIMIT 10;

这基本上与临时表的选项相同,但它通过将前一列中的数据存储在全局变量中来动态创建计数器。它是凌乱的,但可以在单个查询中使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16034757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档