请教一个数据库查询思路

有个二维数组 里面包含多组姓名与身份证号,

有个数据表 里面有姓名与身份证号等字段

如何判断并提取出哪组姓名身份证号不在数据表内 ?

(不考虑只用身份证号的情况 不循环可以实现吗)

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
select * from contents where (`content_id`, `content_type`) in ((1, 1), (2, 2));

这样类似的逻辑是不是可以满足你的需求?

1年前 评论
杨顾昂 (楼主) 1年前
讨论数量: 18

这句话是啥意思?

哪组姓名身份证号不在数据表内

  • 每一组所有要查询的姓名与身份证,保证要么全都存在于数据表中,要么全部不存在吗?
    (这种情况每组抽一人出来匹配就好)

  • 否则要该组全员不存在,才可判定该组不在数据表内?还是有一人不存在,就可以判定?
    (后者能减少不必要的匹配)

1年前 评论
杨顾昂 (楼主) 1年前

姓名加身份证号md5加密之后存一个字段

1年前 评论
杨顾昂 (楼主) 1年前
小猪蹄子 (作者) 1年前

没看懂你的问题,你意思是用身份证号码或者姓名等信息查数据是否存在?存在返回数据,不存在返回提示信息?

1年前 评论
杨顾昂 (楼主) 1年前
select * from contents where (`content_id`, `content_type`) in ((1, 1), (2, 2));

这样类似的逻辑是不是可以满足你的需求?

1年前 评论
杨顾昂 (楼主) 1年前

下次最好带上一些数据,大家能更快理解

比如,一开始还以为你说的二维数组是这样的:

[
    [
        {"uid": 1, "name": "刘一"},
        {"uid": 2, "name": "陈二"},
        {"uid": 3, "name": "张三"}
    ],
    [
        {"uid": 4, "name": "李四"},
        {"uid": 5, "name": "王五"},
        {"uid": 6, "name": "赵六"}
    ],
    [
        {"uid": 7, "name": "孙七"},
        {"uid": 8, "name": "周八"},
        {"uid": 9, "name": "吴九"}
    ]
]

以下SQLite测试通过。MySQL肯定也可以

WITH
  -- 用户表
  user(id, name) AS (
    VALUES
      (1, '刘一'), (2, '陈二'), (3, '张三'), (4, '李四'), (5, '王五'),
      (6, '赵六'), (7, '孙七'), (8, '周八'), (9, '吴九'), (10, '郑十')
  ),

  -- 查询数据表(质数ID姓名故意写错)
  query(uid, name) AS (
    VALUES
      (1, '刘一'), (2, '陈贰'), (3, '张叁'), (4, '李四'), (5, '王伍'),
      (6, '赵六'), (7, '孙柒'), (8, '周八'), (9, '吴九'), (10, '郑十')
  )

SELECT q.uid, q.name
  FROM query q
-- 写法一
--   LEFT JOIN user u ON u.id = q.uid AND u.name = q.name
--  WHERE u.id IS NULL
-- 写法二
 WHERE NOT EXISTS (
           SELECT 1
             FROM user u
            WHERE u.id = q.uid
              AND u.name = q.name);

结果:

uid name
2 陈贰
3 张叁
5 王伍
7 孙柒
1年前 评论
杨顾昂 (楼主) 1年前

身份证号一般是索引吧,也代表人的唯一身份标识,将数组的身份证号提取出来,一次性sql(where in)查询不就行了

1年前 评论
  • 先把身份证信息拿出来组成类似的语句 select id from users where id in(‘xxx’,’xxx’,…) 将id放到数组$arr1
  • 然后将数组中的 id 提取出来放到一个数组 $arr2
  • 使用array_diff($arr2, $arr1);将存在$arr2中但不在$arr1中的id拿出来
1年前 评论

好像是 where in 多列查询。之前实现过 where in 多列查询构建器的宏方法 博客:laravel 中 in 多列特殊查询类型解决方案

1年前 评论
杨顾昂 (楼主) 1年前

你说得循环是否指的循环查询数据库?你得数据量有多大?比较得条件具体是啥,是姓名+身份证得组合?

这里提供一个思路,当前得场景是数据量大、不能循环查询数据库、使用姓名+身份证为统一标识。

将数据库中得姓名和身份证查询出来,放在redis集合中。把你当前得数组也放在redis得集合中。然后取差集。

问题得核心是,把里两个数据源取差集。

1年前 评论
laravel_peng

1. 如果二维数组数据量不多的情况下:

如果二维数组如下

// 二维数组
$twoDimensionArr = [
    [
        'name' => '小明',
        'card_no' => '410234234234234234',
    ],
    [
        'name' => '小红',
        'card_no' => '410234234234223234',
    ],
    ...
];

执行的方法

// 获取二维数组中所有卡号 - (不做去重)
$cardNoArr = array_column($twoDimensionArr, 'card_no');


// 使用 Laravel 的 Eloquent 模型查询
$existCardNoArr = User::query()->whereIn('card_no', $cardNoArr)->pluck('card_no')->toArray();


// 二维数组中的所有 cardNoArr 与 数据库中查询出来的 existCardNoArr 取差集
$diffSetArr = array_diff($cardNoArr, $existCardNoArr); 

// 将二维数组转为 Laravel 中的集合 Collection
$twoDimensionCol = collection($twoDimensionArr);

// 数据库中不存在的,但二维数组中存在的数据
$noDbExistArr = $twoDimensionCol->whereIn('card_no', $diffSetArr)->all()->toArray();

2. 如果二维数组数据量较多:

具体的代码我不写了,提供个思路,循环二维数组,分批次执行以上逻辑。

1年前 评论

是不是 redis 的布隆过滤器更好用啊

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!