【问题标题】:MySQL Select Last Entry for each User, than the next entryMySQL为每个用户选择最后一个条目,而不是下一个条目
【发布时间】:2015-03-31 21:09:46
【问题描述】:

我有 2 个表格,一个用于 users(招聘人员),另一个用于 CV

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 排序的每个用户中选择最后一个 CV,而不是下一个 cv 等等......

结果会是这样的:

简历列表按created_date DESC排序

  • user_1 发布的最后一份简历
  • user_2 发布的最后一份简历
  • user_3 发布的最后一份简历
  • user_发布的最后一份简历...
  • ....
  • user_1 发布的下一个简历
  • user_2 发布的下一个简历
  • user_3 发布的下一个简历
  • user_发布的下一个简历...
  • ....

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的问题的正确版本是:

    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 中表达式的求值顺序。您可以加入来自其他表的附加信息。

    【讨论】:

    • 在第一个 from 之后,我可以在哪里放置表 users 以获取 compay_name?
    • 这个语句没有给出我想要的结果
    • @FarissAbdo 。 . .我在想你只是想要最近的条目。而不是where,它只需要一个order by
    • 乍一看,我认为它有效,但在我查看后,我看到一个用户的多个条目,每个条目一个接一个,我想要的是每个用户的一个条目(最后一个),而不是下一个条目对于每个用户:用户 1 的最后一个条目 用户 2 的最后一个条目 用户 3 的最后一个条目 用户 4 的最后一个条目 ....等等...比最后一个条目之前的条目(因为条目按日期降序排列)用户 1 用户 2 的最后一个条目之前的条目 用户 3 的最后一个条目之前的条目 ...依此类推...
    【解决方案2】:

    我找到了这个解决方案,它似乎有效:

        SELECT IF(@prev != a.`user_id`, @rownum:=1, @rownum:=@rownum+1) as rownumber, 
    @prev:=a.`user_id`, a.* FROM (SELECT `cv`.`id` AS `id` , `cv`.`company_name` , 
    cv.created_date, `cv`.`user_sid` FROM `cv` , (SELECT @rownum := 0, @prev:='') sq 
    {WHERE CLAUSE} ORDER BY `cv`.`user_id` ASC, `cv`.`created_date` DESC) a order by rownumber, 
    created_date desc;
    

    如果你有 where 子句,你可以把它放在 {WHERE CLAUSE}

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多