我有一个连接与records.user_id对应的user.id上的两个表(用户、记录)的查询
记录表包含多个行,这些行的“type”列设置为1或0。
DB::table('users')
->join('records_dev.records', function($join) {
$join->on('users.id', '=', 'records.user_id')
->where(...);
})
->get()->toArray();我希望它返回任何没有备用'type‘值但不知道如何执行此逻辑的用户。
假设abode返回一个类型值为0 1 0的用户数组这是正常的,我希望它只向记录中有0 0 1、1 1 0等值的用户发出信号。
任何帮助都将不胜感激。
发布于 2018-09-12 18:06:39
您可以连接记录表两次,并在第二次连接时将id移位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)')发布于 2018-11-14 18:18:34
我找到了这个解决方案,其中只为第二个“记录”表创建了一个临时表。
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有没有更简单的方法?只是问问。
https://stackoverflow.com/questions/52291682
复制相似问题