MySQL 为每个用户选择最后一个条目,而不是下一个条目

标签 mysql

我有 2 张表,一张用于用户(招聘人员),另一张用于简历

CREATE TABLE users (
    id int primary,
    email string,
    company string
)
CREATE TABLE cv (
    id int primary,
    title string,
    user_id int,
    created_date datetime
)

用户可以发布多份简历

所以我想要的是从每个用户中选择按created_date排序的最后一个简历,而不是下一个简历,依此类推...

结果会是这样的:

简历列表按created_date DESC排序

  • 用户_1 发布的最后一份简历
  • user_2 发布的最后一份简历
  • user_3 发布的最后一份简历
  • 用户_发布的最后一份简历...
  • ...
  • 用户_1 发布的下一份简历
  • user_2 发布的下一份简历
  • user_3 发布的下一份简历
  • 用户_发布的下一份简历...
  • ...

我想要的是每个用户的一个条目(最后一个),而不是每个用户的下一个条目:

last Entry for user 1
last entry for user 2
last entry for user 3
last entry for user 4
....and so on...than
the entry before the last (because entries are ordred by date desc) for user 1
the entry before the last for user 2
the entry before the last for user 3
...and so on...

我发现这个解决方案不起作用

SELECT IF(@prev != a.`company_name`, @rownum:=1, @rownum:=@rownum+1) 
as rownumber, @prev:=a.`company_name`, a.* FROM 
(SELECT `cv`.`id` AS `id` , `cv`.`company_name` FROM `cv` , 
(SELECT @rownum := 0, @prev:='') sq ORDER BY `created_date` DESC) a order by rownumber

最佳答案

您的问题的正确版本是:

select cv.*
from (select cv.*,
             (@rn := if(@c = company_name, @rn + 1,
                        if(@c := company_name, 1, 1)
                       )
             ) as rn
      from cv cross join
           (select @c := '', @rn := 0) vars
      order by company_name, created_date desc
     ) cv
order by rn, user_id;

您希望将所有变量赋值放在一个表达式中,因为 MySQL 不保证 select 中表达式的求值顺序。您可以加入其他表中的附加信息。

关于MySQL 为每个用户选择最后一个条目,而不是下一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305210/

相关文章:

mysql - 如何连接两个表对两个唯一列进行排序?

mysql - 以下场景需要 SQL 查询

PHP 和 PDO 类

php - 选择多个变量列

PHP批量更新$_POST值

mysql - 第1548章

java - GPS 坐标未正确存储在从 android 到 php 的数据库中

MySQL语法错误异常 : Error while upgrading MySQL version

python - 使用 sqlalchemy 核心的 MySQL 多表更新查询?

MySQL 查询从每个类别 LEFT JOIN 获取 1 个结果