Как использовать DISTINCT ON с MySQL, используя ActiveRecord - PullRequest
0 голосов
/ 20 декабря 2018

Желаю всего самого последнего посещения всех отдельных пользователей.

Для этого я использую запрос ниже

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"] 

canкто-нибудь поможет мне в этом

Ожидаемый вывод что-то вроде этого

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

21 - user_id, а значение - время последнего посещения

Использование mysql в качестве базы данных

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Таким образом, вы хотите, чтобы все посещения пользователей происходили в последний раз.

Вместо использования функции DISTINCT вы можете использовать GROUP с функцией 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}

Надеюсь, что это работает для вас.

FYI DISTINCT ON (столбцы).такое синтаксис PostgreSQL.

0 голосов
/ 20 декабря 2018

Как я уже сказал в комментариях DISTINCT ON(column), * - это синтаксис 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...