MySQL搜索查询

时间:2010-12-09 22:07:12

标签: sql mysql database-design

我正在创建一个存储用户统计数据的系统,如下所示:

Table Stats
===========
id    name
-----------
1     height
2     weight
3     eye_colour
4     etc...
Table Stat_Options
==================
id    stat_id    name
1     1          170cm
2     1          172cm
3     1          174cm
4     2          60kg
5     2          65kg

我将stat_options的ID存储在用户表中,如下所示:

Table User_Stats
================
id    user_id    height    weight    eye_colour    etc...
---------------------------------------------------------
1     10         3         5         7

存储ID的原因是,stat_option的'name'总是可以改变,用户记录也不需要改变。

但是看着这个我觉得它可能会出现问题,特别是在搜索时。例如,如果我想搜索两个特定高度之间的所有用户?我想到的一个解决方案是在Stat_Options表中插入一个'value'字段,但我仍然不确定它是否有用。有什么建议吗?

5 个答案:

答案 0 :(得分:1)

恕我直言,你应该使用像Stat_Options这样的查找表,仅用于属性具有有限数量值的情况,例如眼睛颜色。尝试使用像这样的表格(理论上)具有无限数量的值,如身高和体重,正如您已经猜到的那样,会引起严重的麻烦。我会将这些值直接存储在User_Stats表中。

答案 1 :(得分:1)

此类设计的问题在于您在Stat_Options表中混合定量值(高度,重量)和定性值(eye_colour)。如果您绝对想要这一点,请将定量和定性值分解为2列。

Table Stat_Options
==================================
id   stat_id   name   value  unit
===  =======   =====  =====  =====
  1        1   170cm    170     cm
  2        1   172cm    172     cm
  3        1   174cm    174     cm
  4        2    60kg     60     kg
  5        2    65kg     65     kg
  6        3   black   NULL  black

然后与其他建议的JOIN表一起获取值BETWEEN x AND y

答案 2 :(得分:0)

从您的示例中,您是否可以通过查询来获得x和y之间高度的所有用户:

Select user_id from User_Stats where User_Status.height between x and y

答案 3 :(得分:0)

SELECT user_id FROM User_Stats WHERE height BETWEEN 170 AND 172;

我猜那个。

但是对于表格的结构,我可以建议如下:

  1. 不需要Stats表,因为它可以包含在User_Stats表中没有问题。这样,您可以更好地规范表格的使用情况。

  2. IF并且只有当身高和体重的值可以超过你所拥有的3时(例如180,183,192,200,110 ......),我建议与第1点相同。删除表并包含在User_Stats表中,因为此值可以更改,并且实际上不需要为此创建新表。这样,您可以更快速,更轻松地在单个表格中比较您想要的任何内容。

答案 4 :(得分:0)

这样做不是一个好主意。使用Stat_option来绑定下拉列表例如,如果你有一个从不经常更改值的数字..

为什么不用整数字段向User-stats表中添加高度?

但如果你真的想要你能做到:

SELECT * FROM USER_STATS 
INNER JOIN STAT_OPTION 
ON USER_STATS.height in (
 SELECT ID FROM Stat_Options
 WHERE NAME BETWEEN 170 AND 175)

或类似的东西,我不习惯使用MySql ..