简体   繁体   English

Ruby on Rails:具有空值的订单记录

[英]Ruby on Rails: order records with null value

User.where(id: users_ids)
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email')

I need to order records by f_name . 我需要按f_name排序记录。 When f_name is nil then records are moved to the end and ordered by email. f_namenil记录将移至末尾并通过电子邮件进行排序。

Below is the query, 下面是查询,

User.where(id: users_ids)
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email')
    .where('names.first_name IS NOT NULL')
    .order('f_name asc').union(
User.where(id: users_ids)
    .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
    .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
    .select('users.*, names.first_name AS f_name , emails.email AS primary_email')
    .where('names.first_name IS NULL')
    .order('primary_email asc'))

The above query don't work. 上面的查询不起作用。

Database - MySql 数据库-MySql

I resolved this issue by bad way, but resolved 我用不好的方法解决了这个问题,但是解决了

users_with_names = User.where(id: users_ids)
                       .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
                       .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
                       .select('users.*, names.first_name AS f_name , emails.email AS user_email')
                       .where('names.first_name IS NOT NULL')
                       .order('f_name asc')

users_without_names = User.where(id: users_ids)
                          .joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
                          .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
                          .select('users.*, names.first_name AS f_name , emails.email AS user_email')
                          .where('names.first_name IS NULL')
                          .order('user_email asc')

@contacts = [users_with_names, users_without_names].flatten.paginate(page: params[:page], per_page: 10)

This issue is resolved in this way 此问题已通过这种方式解决

joins('LEFT JOIN names ON names.user_id = users.id AND names.primary = 1')
 .joins('LEFT JOIN emails ON emails.user_id = users.id AND emails.primary = 1')
 .select('users.*, names.first_name AS f_name , emails.email AS user_email,
          names.last_name AS l_name, names.middle_name AS m_name, ISNULL(names.first_name) AS name_present')
 .order('name_present, f_name ASC, emails.email ASC')
 .group('users.id')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM