mysql比较连续值

rt4zxlrg  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(358)

我有一个查询,它将user.id上的两个表(users,records)连接起来,user.id对应于records.user\u id
records表包含多行,其中“type”列的值集为1或0。

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

我希望它返回任何没有备用“type”值但无法确定如何执行此逻辑的用户。
假设abod返回一个类型值为0 1 0的用户数组这是正常的,我希望它只向记录中包含0 0 1、1 1 0等的用户发出信号。
任何帮助都将不胜感激。

k3fezbri

k3fezbri1#

您可以两次联接records表,第二次联接时将id移动1。然后可以比较r1.type=r2.type,这意味着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列中没有间隙。如果存在间隙,则可以向records表中添加一个新列并对其排序(1、2、3、…)。然后使用该列,而不是像这样使用user\u id(如果新列名为seq):

$join->on('r1.seq', '=', '(r2.seq - 1)')
e4yzc0pl

e4yzc0pl2#

我找到了这样一种解决方案,即只为第二个“records”表创建一个临时表。

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

有没有更简单的方法?只是问问而已。

相关问题