mysql сравнивает последовательные значения - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть запрос, который объединяет две таблицы (пользователи, записи) в user.id, который соответствует records.user_id

Таблица записей содержит несколько строк со столбцом типа, который имеет 1или значение 0 установлено.

DB::table('users')
        ->join('records_dev.records', function($join) {
            $join->on('users.id', '=', 'records.user_id')
                ->where(...);
        })
        ->get()->toArray();

Я бы хотел, чтобы он возвращал пользователей, у которых нет альтернативных значений типа, но которые не могут понять, как выполнить эту логику.

Допустим, чтоthe abode возвращает пользовательский массив со значениями типа 0 1 0, это нормально, я хотел бы, чтобы он только сигнализировал о пользователях, которые имеют 0 0 1, 1 1 0 и т. д. в своих записях.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я нашел это решение, когда временная таблица создается только для второй таблицы «записей».

CREATE TEMPORARY TABLE temporary_records (
       id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id) ) 
SELECT user_id, id, type 
FROM records ORDER BY user_id ASC, id ASC

Тогда мы можем легко найти любые последовательные записи.

SELECT user_id FROM (
SELECT  g1.user_id,
        (g1.type LIKE g2.type) AS issue
FROM    temporary_records g1
INNER JOIN  temporary_records g2 ON g2.id = g1.id + 1
WHERE   g1.user_id = g2.user_id ) derived_table WHERE derived_table.issue = 1

Есть ли более простой способ? Просто спрашиваю.

0 голосов
/ 12 сентября 2018

Вы можете объединить таблицу записей дважды, а во втором соединении сдвинуть идентификатор на 1. Затем вы можете сравнить, если r1.type = r2.type, что означает, что последовательные строки в столбце типа совпадают.

Кроме того, вам нужно сделать выбор в этом случае.

Он должен выглядеть примерно так:

DB::table('users')
->select('users.*', 'r1*')
->join('records_dev.records r1', 'users.id', '=', 'r1.user_id')
->join('records_dev.records r2', function ($join) {
    $join->on('r1.user_id', '=', '(r2.user_id - 1)')
        ->where('r1.type', '=', 'r2.type');
})
->get()->toArray();

или примерно так:

DB::table('users')
->select('users.*', 'r1*')
->join('records_dev.records r1', 'users.id', '=', 'r1.user_id')
->join('records_dev.records r2', 'r1.user_id', '=', '(r2.user_id - 1)')
->where('r1.type', '=', 'r2.type')
->get()->toArray();

Этопредполагается, что в столбце user_id в таблице записей нет пробелов.Если пробел существует, вы можете добавить новый столбец в таблицу записей и упорядочить его (1, 2, 3, ...).Затем используйте этот столбец вместо user_id следующим образом (если имя нового столбца seq):

$join->on('r1.seq', '=', '(r2.seq - 1)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...