복붙노트

[RUBY-ON-RAILS] MySQL은 액티브를 사용하여 DISTINCT ON을 사용하는 방법

RUBY-ON-RAILS

MySQL은 액티브를 사용하여 DISTINCT ON을 사용하는 방법

모든 고유 한 사용자 모두의 최신 방문합니다.

이를 위해 나는 쿼리 아래 사용하고 있습니다

Event.order(time: :desc).select('DISTINCT ON(user_id) user_id, time')

SQL 구문 오류가.

ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON(user_id) user_id, time FROM `events` ORDER BY `events`.`time` DESC ' at line 1: SELECT  DISTINCT ON(user_id) user_id, time FROM `events` ORDER BY `events`.`time` DESC LIMIT 11)

이벤트 테이블 열 이름

["id", "visit_id", "user_id", "name", "properties", "time"] 

이에 캔 누구의 도움 나를

이 같은 예상 출력 뭔가

{ 21 => "2018-12-18 09:44:59", 42 => "2018-12-19 12:08:59"}

21 USER_ID이며 값은 마지막 방문 시간

데이터베이스로 MySQL을 사용

해결법

  1. ==============================

    1.당신은 마지막 방문 시간에 모든 사용자가 방문을 원하는 그래서.

    당신은 마지막 방문 시간에 모든 사용자가 방문을 원하는 그래서.

    대신 사용 DISTINCT 기능, 당신은 MAX 기능 그룹을 사용할 수 있습니다.

    쿼리 모습처럼

    Events.group(:user_id).maximum(:time)
    

    이 출력 원하는 결과

    {21=>Tue, 18 Dec 2018 11:15:24 UTC +00:00, 23=>Thu, 20 Dec 2018 06:42:10 UTC +00:00}
    

    당신을 위해이 작품을 바랍니다.

    참고 DISTINCT ON (열). PostgreSQL의 구문입니다.

  2. ==============================

    2.나 코멘트 DISTINCT ON (열)에서 말했듯이, * PostgreSQL의 SQL 구문이다.

    나 코멘트 DISTINCT ON (열)에서 말했듯이, * PostgreSQL의 SQL 구문이다.

    당신이 아래의 쿼리는 MySQL의에서 다시 작성해야 할 필요가

    SELECT 
     DISTINCT ON(user_id) AS user_id, time
    FROM 
     <table>
    ORDER BY 
     time DESC
    LIMIT 11 
    

    그렇게 할 수있는 가장 쉬운 SUBSTRING_INDEX를 사용 (GROUP_CONCAT (..)). 는 당신에게 정확한 결과를 제공한다 아래 쿼리합니다.

    SET SESSION group_concat_max_len = @@max_allowed_packet;
    
    SELECT 
       user_id
     , SUBSTRING_INDEX(
         GROUP_CONCAT(time
                      ORDER BY
                         time DESC
         )
         , ','
         , 1
     ) AS time
    FROM 
     <table>
    GROUP BY 
     user_id
    ORDER BY 
     time DESC
    LIMIT 11
    
  3. from https://stackoverflow.com/questions/53868870/how-to-use-distinct-on-with-mysql-using-activerecord by cc-by-sa and MIT license