MySQL-计数器查询

时间:2019-04-03 10:55:08

标签: mysql

有两个表user和user_demographics

用户具有以下基本结构(确实有更多字段,但此处不需要)

id  name    email            gender   age   ethnicity
1   test1   test1@test.com   1        1     1
2   test2   test2@test.com   1        2     1
3   test3   test3@test.com   2        3     2
4   test4   test4@test.com   3        1     1
5   test5   test5@test.com   2        4     5


**Gender**: 
   1 - Male, 
   2 - Female, 
   3 - Prefer not to say

**Age**: 
   1 - 16-20, 
   2 - 21-24, 
   3 - 25-30, 
   4 - 31-24

**Ethnicity**: 
   1 - White, 
   2 - Black, 
   5 - Prefer not to say

依此类推,目前大约有1000位用户。

user_demographics结构

coreid,类型,选项(为了更清楚地说明这个问题,“类型”将是文本)

coreid, type        option
1       gender      1
1       gender      2
1       age         1
1       age         3
1       ethnicity   1
2       gender      2
2       gender      3
2       age         3
3       gender      1

在基于Web的表单上,我有3组复选框列表,每个复选框用于性别,年龄,种族,并且用户可以从中选择多个。他们单击更新,这些详细信息如上所述存储在mysql数据库中。 coreid与另一个表相关,但此处不相关。

我想做的是获取每个coreid的用户总数,无论它是什么类型。您选择的选项越多,计数就会越小。因此,Coreid 3的数量应该最多,因为我只选择了一个选项。

示例:Coreid 3正在选择所有男性

示例:coreid 2正在选择所有(女性,并且“不想说”),年龄范围为25-30岁

正在努力创建一个查询,该查询将为我提供所需的结果,希望这是有意义的。

整个系统背后的想法是,我们有一个供用户填写的大表格,并将其存储在用户表中的信息中。然后,管理团队的成员可以进入并通过从我们收集的各种人口统计信息中选择选项来选择这些用户。因此,他们可能只想看到所有人都勾选了“男”和“不愿说”的性别选项的所有人。另一位管理员成员可能会说,他们想要25至30岁之间的所有男性。或者他们可以在性别下勾选所有选项。他们的想法是他们可以选择任何组合并获得结果列表。此刻,我只需要为选择的组合取个数即可。

1 个答案:

答案 0 :(得分:0)

通过它的声音,您可能需要处理动态SQL,在该SQL中您实际上是在即时构建查询,然后执行该查询。另外,为澄清我的想法,您的要求如下。 CoreID就像一组过滤器,有些管理员对获取特定用户的人数或详细信息感兴趣。他们对

感兴趣
EITHER gender condition (1 or 2) 

以及其他年龄条件(1或3) 还有一个种族

可能定位到可能影响这些受众特征的产品。因此,您将预先查询CoreID = 1的每条记录,然后开始构建查询。您可能希望按TYPE来对查询进行排序,以将常见项目(例如性别,年龄,种族类别)分组。

然后,在您的任何一个本地化代码(未指示,例如C#,VB,java等)中,您都需要以以下方式构建查询:括号或相同类别中的内容,以及不同类别之间的逻辑与

where
      (    Gender = 1
        OR Gender = 2 )
  AND (    Age = 1
        OR Age = 3 )
  AND (    Ethnicity = 1 )

如果您尝试编写为MySQL存储过程,那将是一种动态SQL查询...无论哪种方式,都需要根据某人正在寻找的核心条件来构造WHERE子句。

您是正确的,对于CoreID = 3,最后一个将是最简单的

WHERE ( Gender = 1 )

弄清语言来源,我或其他人也许可以提供其他指导,但是,如果我准确的话,您应该尝试编写自己的第一遍代码,但是我会为您拍出伪代码,例如< / p>

获取一个CoreID的记录顺序,按条件类型排序。

prep variable identifying if pending open Parenthesis
prep variable identifying last "type" building for.

for each record

  If new type
     if has Open Parenthesis
        add closing paren
        add logical AND before the next entry we are getting

     add open parenthesis
     set flag we have open parenthesis

  else
     since same type as last type, add logical OR

go to next record, repeat.

If after last record we would always need to close parenthesis even if a single criteria