【问题标题】:How to retrieve data from table which is separated by comma in sql?如何从sql中用逗号分隔的表中检索数据?
【发布时间】:2018-08-10 12:30:00
【问题描述】:

我有包含如下数据的学生表:

id       name       activity
1        susan      1,2
2        denny      1,2,3
3        ken        3

我想从这个表中选择所有数据,比如 name 和 id,activity 等于 2。我已经使用 like 完成了一个 sql 查询,但它不起作用。

$sqll = mysqli_query($con,"SELECT id,studentname FROM students WHERE activity LIKE '%$activity'");

如果另一行包含像id : 4 name:ben activity : 22 这样的数据,它也会显示这一行。我只想要包含活动 2 的行。

谁能为此提出解决方案?

【问题讨论】:

  • $sqll = mysqli_query($con,"SELECT id,studentname FROM students WHERE activity LIKE '%$activity'");
  • 有没有其他不用LIKE的方法
  • 这个数据是非规范化的,这就是你苦苦挣扎的原因。如果您对数据进行了适当的规范化,其中活动列表位于子表中,并且外键返回到学生表,这甚至都不是问题。在单个字段中存储多个值是一种反模式。了解实体关系设计和数据库规范化,以了解如何正确构建数据。那么您的查询也会简单得多。这是一个典型的 X-Y 问题 - 您试图解决症状而不是解决真正的原因。
  • 不要以这种方式存储数据 (why?)。
  • 以这种形式存储数据的人对您造成了伤害。从长远来看,正如其他人所建议的那样,将数据重组为两个表会做得更好。我知道这是一个真正的痛苦。这就是为什么我们一直敦促人们在为其他人构建数据库之前学习数据库设计。

标签: php mysql sql database-design


【解决方案1】:

到目前为止,我同意 cmets 关于规范化数据的观点,但要使用表结构来回答您的问题,您可以这样做:

$sqll = mysqli_query($con,"SELECT id,studentname FROM students WHERE CONCAT(',',activity,',') LIKE '%,$activity,%'");

请注意,您在字段数据和您要查找的特定活动的任一侧连接逗号。另请注意,我还在 like 的右侧添加了一个 %,以便捕捉到“denny”

【讨论】:

  • 如果我给 $activity 它将导致 sql 注入。如何预防?
  • 如果活动来自 GET 或 POST 请求,则使用 php filter_input 函数并验证为整数,则检查不为假,否则只需在运行前检查 is_numeric,如果不是数字则抛出错误或类似响应
【解决方案2】:
SELECT  id, studentname
    FROM  students
    WHERE  FIND_IN_SET("$activity", activity);

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2012-04-19
    • 2015-09-05
    • 2019-07-14
    • 2012-02-04
    • 2022-08-20
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多