mysql - SQL 查询以显示具有均匀分布值的前 x 个记录

标签 mysql sql distinct

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

我需要编写一个查询来显示最近添加的前 10 个联系人(unix 时间戳),但我不希望它是所有营销联系人(即使前 10 个是),我想查看取而代之的是前 100 名,并获得来自不同部门的 10 个联系人。因此,前 10 名不是所有营销人员,而是可能有 2 名营销人员、2 名 IT 人员、2 名人力资源人员和 2 名人员。

所以我的查询基本上是这样的:

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 行。

仅通过查询就可以实现吗?或者我应该以编程方式执行某些操作以应用减少查询结果所需的逻辑。

最佳答案

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

如果创建如下临时表:

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)
);

现在

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,依此类推。

你现在可以做一个

select * 
from tmp_company_sequence 
order by counter asc, date_added desc 
limit 10;

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

编辑:

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

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;

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

关于mysql - SQL 查询以显示具有均匀分布值的前 x 个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034757/

相关文章:

sql - SQL:选择至少一行具有特定值的不同“类别”

mysql - 了解 Sequelize 中的关联

mysql - 找出 24 小时内的最大值

php - 尝试在 Laravel 中的一对多关系中查找子记录的父记录时获取 null

mysql - 在 SQL 中连接第三个表

MYSQL - 查找不同的记录并按另一个字段长度排序

mysql - COUNT(DISTINCT X) MySQL 查询没有给出我需要的结果

php - 我需要清理用于声明几何形状的字符串吗?

php - 当绑定(bind)变量难以使用时如何对抗SQL注入(inject)漏洞?

sql - 在一天中的时间段内计算结果