Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何选择独立的|列mysql php(1 | 0 | 2 | 1 | 0 | 0 | 1)_Php_Mysql - Fatal编程技术网

如何选择独立的|列mysql php(1 | 0 | 2 | 1 | 0 | 0 | 1)

如何选择独立的|列mysql php(1 | 0 | 2 | 1 | 0 | 0 | 1),php,mysql,Php,Mysql,我的mysql表中有student_hobbys列: 霍布斯学生 1|0|1|1|0|0|1|0 现在我尝试搜索所有喜欢地理(学校科目)的学生。在student_hobbys列中,我将该值保存在第二个参数(1 | here | 0 | 1 |……)中。如何创建一个mysql查询来选择喜欢地理的学生 请帮助请阅读为什么你的设计是个坏主意。您应按以下方式存储数据: 表3:学生: id | name 1 | John 2 | Jane 3 | Mike 4 | Spike 表1:爱好: i

我的mysql表中有student_hobbys列:

霍布斯学生

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

请帮助

请阅读为什么你的设计是个坏主意。您应按以下方式存储数据:

表3:学生:

id | name
 1 | John
 2 | Jane
 3 | Mike
 4 | Spike
表1:爱好:

id | name
 1 | biology
 2 | geogryphy
 3 | football
 4 | programming
表1学生的业余爱好:

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 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 |

但是,如果您想坚持自己的设计,可以尝试以下方法:

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

但以编程方式生成此查询将非常复杂。在大数据集上,它可能也会比上面的解决方案慢,因为无法使用索引进行此类查询

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

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 |
设置@hobby_位置=2;
挑选*
来自学生

这里是CONV(REVERSE(REPLACE(student_hobbys,“|,”),,2,10)&1,现在您知道了为什么在单个数据库列中以分隔字符串存储数据是一个如此糟糕的想法。请:最好开始熟悉Yes。。这是个坏主意,但我有超过100k行;(相关问题: