【问题标题】:How SELECT separate | column mysql php (1|0|2|1|0|0|1)SELECT 如何分离 | mysql php 列 (1|0|2|1|0|0|1)
【发布时间】:2019-11-24 13:25:53
【问题描述】:

我的 mysql 表中有列 student_hobbys:

学生爱好

1|0|1|1|0|0|1|0

现在我尝试搜索所有喜欢地理(学校科目)的学生。在 student_hobbys 列中,我将此值保存在第二个参数 (1|here|0|1|...) 中。如何创建一个 mysql 查询来选择喜欢地理的学生?

请帮忙

【问题讨论】:

标签: php mysql


【解决方案1】:

请阅读here 为什么你的设计是个坏主意。您应该以normalized 的方式存储数据,如下所示:

表学生:

id | name
 1 | John
 2 | Jane
 3 | Mike
 4 | Spike

餐桌爱好:

id | name
 1 | biology
 2 | geogryphy
 3 | football
 4 | programming

table students_hobbies:

student_id | hobby_id
         1 | 3
         1 | 4
         2 | 1
         2 | 2
         3 | 1
         3 | 2
         3 | 4
         4 | 3

架构定义:

CREATE TABLE students (
  id INT UNSIGNED AUTO_INCREMENT,
  name VARCHAR(50),
  PRIMARY KEY (id),
  INDEX (name)
);

CREATE TABLE  hobbies (
  id INT UNSIGNED AUTO_INCREMENT,
  name VARCHAR(50),
  PRIMARY KEY (id),
  INDEX (name)
);

CREATE TABLE students_hobbies (
  student_id INT UNSIGNED,
  hobby_id INT UNSIGNED,
  PRIMARY KEY (student_id, hobby_id),
  INDEX (hobby_id, student_id)
);

您的 SELECT 查询现在将是:

SELECT s.*
FROM students s
JOIN students_hobbies sh ON sh.student_id = s.id
JOIN hobbies h ON h.id = sh.hobby_id
WHERE h.name = 'geogryphy';

结果:

| id  | name |
| --- | ---- |
| 2   | Jane |
| 3   | Mike |

View on DB Fiddle

但是 - 如果你想坚持你的设计,你可以尝试这样的事情:

SELECT *
FROM students
WHERE student_hobbys LIKE '_|1%'

View on DB Fiddle

但以编程方式生成此查询会相当复杂。在大数据集上,它可能也会比上述解决方案慢,因为这种查询无法使用索引。

如果您想避免应用程序中的复杂代码,您将需要一个相当复杂的查询。一种方法是将您的字符串转换为位掩码,然后使用位运算符& 检查特定位置的位:

SET @hobby_position = 2;

SELECT *
FROM students
WHERE CONV(REVERSE(REPLACE(student_hobbys, '|', '')), 2, 10) & 1 << (@hobby_position - 1);

| id  | name | student_hobbys  |
| --- | ---- | --------------- |
| 2   | Jane | 1|1|1|1|0|0|1|0 |
| 3   | Mike | 1|1|1|1|0|0|1|0 |

View on DB Fiddle

还有其他方法 - 但您不太可能找到一种可以与您的设计配合使用的简单方法。

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2018-09-26
    • 1970-01-01
    • 2013-07-15
    • 2014-12-30
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多