【问题标题】:Using age and gender to search for ID numbers in a table使用年龄和性别在表格中搜索身份证号
【发布时间】:2017-02-09 10:18:15
【问题描述】:

在可以搜索表中用户记录的界面中。

操作员必须能够按用户(记录)的年龄和/或性别进行搜索。但是,这必须通过使用捕获的用户的 ID 号来完成。

这是可能的,因为 ID 号可以分解为可用数据。

一个 ID 号有 13 位数字:

例如。 6911205062080

可以细分如下:

YYMMDDSSSSCAZ

其中 (YYMMDD) 指的是日期。 1969 年 11 月 20 日显示为 691120

(SSSS) 是指性别。女性的编号范围为 0000-4999,男性的编号范围为 5000-9999

CAZ 也具有含义,但它们与问题的上下文无关。 `

用户可以选择搜索所有年龄段,或从三个年龄段中选择:

A:18-38, B:39-59, C:60 以上。

-他们可​​以选择一个选项[A或B或C]

-或者他们可以选择两个选项[A和B,A和C或B和C],

-或者他们可以选择所有3个选项[A and B and C],意思是全部)

这意味着如果他们选择搜索所有年龄组,则会发布一个包含他们选择的数组。

选择性别时:

-他们可​​以搜索所有性别[男性和女性]

-或者选择一个选项[男性或女性]

数据被发送给我,现在我必须处理数据以返回正确的记录。

现在我知道我必须使用子字符串。 ID 字段存储为不同的字符,但是为了确定年龄,我必须对 (YYMMDD) 部分进行子串化并将其转换为日期以便正确比较它,并且 (SSSS) 必须转换为整数以确定它是否小于 5000

这是我目前的代码:

if($_POST['gender'] == 'all'){
    $gender="";
}elseif($_POST['gender'] == 'male'){
    $gender = " and userIDNumber = "."ESTABLISH ALL ID's THAT ARE MALE";
}elseif($_POST['gender'] == 'female'){
    $gender = " and userIDNumber = "."ESTABLISH ALL ID's THAT ARE FEMALE";
}

$age = "";
if($_POST['radioAge'] == 'select'){
    $branches = " and userIDNumber in (SELECT A WAY TO FIND OUT HOW TO ESTABLISH THE AGES THAT FALL IN THE GROUPS SPECIFIED BY THIS ARRAY in(".  implode(",", $_POST['age_group']).")) ";
}

$query = "SELECT * FROM user_table WHERE status='Active'".$gender.$age;

使用 PHP 和 SQL,我将如何使用已发布的性别选择和年龄选择来找到正确的 ID 号,从而找到正确的记录?

【问题讨论】:

  • 您不能将相关数据存储在单独的列中,例如sexbirthDate
  • @Mattea 那将是理想的,但我无法决定。
  • 这就是为什么您不应该尝试在单个列中存储多条信息的原因。你遇到这样的问题。此外,您将无法根据出生日期或性别轻松对列表进行排序,如果注册的女性超过 5000 人会怎样?如果您使用适当的数据类型将性别、出生日期等存储在单独的列中,您的情况会好得多。
  • @AlbertusBrandVenter 你甚至可以让它工作,但我担心有很多记录,没有合适的索引,它的表现会很差。

标签: php sql postgresql


【解决方案1】:

对于性别,请尝试以下操作:

if($_POST['gender'] == 'all'){
    $gender="";
}elseif($_POST['gender'] == 'male'){
    $gender = "and CONVERT(SUBSTR(userIDNumber, 6, 4), INTEGER) < 5000";
}elseif($_POST['gender'] == 'female'){
    $gender = "and CONVERT(SUBSTR(userIDNumber, 6, 4), INTEGER) >= 5000";
}

【讨论】:

    【解决方案2】:

    首先,您需要从 ID-s 中提取年份部分的信息: 您需要为此使用子字符串和字符串连接。 之后,您需要将其转换为日期并使用 now() 函数来获取日期差异。选择日期(年份,'2011-10-02','2012-01-01'); 最后你需要像这样在分支之间创建:

     ... where  DATEDIFF(year, '2011-10-02', now()) between 18 and 38 ...
    

    性别: 同样的方法,使用子字符串从 id 中提取信息,将其转换为数字。

    ... where CAST(substring(ID) as numeric) <5000 --female
    

    您还需要创建 AND 、 OR 运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2019-12-27
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多