Php MySQL运算符()中仅包含此值

Php MySQL运算符()中仅包含此值,php,mysql,Php,Mysql,在一个问题上挣扎了好几个小时,更多的是关于这个问题 在键入textboxa时描述脚本在name=contain的SQL数据记录中搜索。假设我输入了两个名称,以逗号(X,Y)2分隔: a) 如果您选择“all containing typed values”(所有包含类型化值)是为了查找所有记录,在上述“名称”中。它起作用: $where. = "AND name IN ('". implode (' ', ' ', $array). "')"; 型号:包含X。 包含Y; 包含Y和X 这是

在一个问题上挣扎了好几个小时,更多的是关于这个问题

在键入textboxa时描述脚本在name=contain的SQL数据记录中搜索。假设我输入了两个名称,以逗号(X,Y)2分隔:

a) 如果您选择“all containing typed values”(所有包含类型化值)是为了查找所有记录,在上述“名称”中。它起作用:

 $where. = "AND  name IN ('". implode (' ', ' ', $array). "')"; 
型号:包含X。 包含Y; 包含Y和X

这是它应该做的

(b) )如果选择“all containingonly,则要输入的值将查找仅出现在“name”中的记录

在这里我不知道怎么做

Model:只包含X和Y,我不希望记录只包含X,而是Y,或者,如果在MySQL中,“name”是3个选项(X,Y,Z)

我不知道如何更清楚地解释:---------------示例:表中有5个值,其中名称以不同的组合表示: 1) 名字1,名字2, 2) 名字1,名字8, 3) 名字1,名字9, 4) 名字8,名字3, 5) 名字4,名字5, 使用选中的第一个选项,其中文本框键入:“Name1,Name”,结果将是:1)、2)、3)、4),这是有效的

使用第二个结果应仅为2)

a)res1或res2或res1和res2的结果。 现在我需要找到一个解决方案,当我在文本框中输入“res1,res2”时,结果将是:只有包含res1和res2的记录,,之后什么都没有

----编辑答复:

+--------------------- my_val_search -----------+
| aid | int(11)     | primary key auto_increment|
|name | varchar(255)|               |
+-----------------------------------------------+
记录:

1|Ruby
2|CSS
3|HTML
4|PHP
5|Python
6|SQL
7|Javascript
8|C++
9|AJAX
10|Java

+---------------------- topics -----------------+
|id      | int(11) | Primary key auto_increment |
|dateline| date    |                            |
 |author  | varchar(30) |                        |
|message | text    |                            |
|aid     |int(11) |foreign key with my_val_search|
+-----------------------------------------------+
现在,如果您键入搜索“Ruby,Python”,我只想找到主题为“Ruby和Python”的记录

通过使用

$myValInput = $_GET['keywords'];
$where = "AND a.name IN('" . implode("','", $myValInput. "')";
搜索记录,其中键入“Python,Ruby”时分为: -蟒蛇 -鲁比, -Python和Ruby 我想让结果只显示在“Python和Ruby”中。另外,如果有人键入“Python,Ruby,Java”,结果应该是 -Python、Ruby、Java、,
记录应该和我写的一样,仅此而已。

这里有一个解决方案的尝试,但是在查询方面有比使用常规的非规范化结构来处理此问题更好的解决方案-因此,如果您要大量查询此问题(并使用大量术语),您可能希望在原始表中缓存查找值,然后按其内容进行查询。无论如何,要使用常规联接解决此问题,请执行以下操作:

给定数据:

CREATE TABLE foo (id int);
CREATE TABLE foo_bar (foo_id int, bar_id int);
CREATE TABLE bar (id int, name varchar(25));
INSERT INTO foo VALUES (1), (2), (3), (4);
INSERT INTO bar VALUES (1, 'Ruby'), (2, 'Python'), (3, 'PHP');
INSERT INTO foo_bar VALUES (1, 1), (2, 1), (3, 3), (4, 3), (2,2);
您可以通过手动加入每个术语,从同时包含Ruby和Python的
foo
中检索id值:

SELECT f.id FROM foo f 
JOIN foo_bar fb ON fb.foo_id = f.id
JOIN bar b ON fb.bar_id = b.id AND b.name = 'Ruby' 
JOIN foo_bar fb2 ON fb2.foo_id = f.id
JOIN bar b2 ON fb2.bar_id = b2.id AND b2.name = 'Python'

这使得
2
成为所有语言都存在的唯一id。

在中使用无法获得您所期望的

与子查询一起使用时,IN是=ANY的别名。因此,这两个语句是相同的:

此外,我认为您的模式不正确。主题应该是
parent
,主题关键字应该是
child
。如果我是您,我会这样做

创建表(如果不存在)`topic`(
`id`int(10)无符号非空自动增量,
`日期行`日期,
`作者varchar(30岁),
`信息`文本,
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8自动增量=1;
创建表(如果不存在)`topic_keywords`(
`主题`int(10)无符号非空,
`关键字'varchar(255),
外键(`topic`)引用了`topic`(`id`),
唯一索引(`topic`、`keyword`)
)引擎=InnoDB;
就你而言,我认为全文是合适的。

创建表(如果不存在)`topic`(
`id`int(10)无符号非空自动增量,
`日期行`日期,
`作者varchar(30岁),
`信息`文本,
`关键词'varchar(255),
主键(`id`),
全文(`keywords`)
)ENGINE=InnoDB默认字符集=utf8自动增量=1;
插入“主题”(“关键字”)中
值('Ruby,Python'),
(‘Ruby’),
('Ruby,SQL'),
(‘Python’),
('Python,SQL'),
('Ruby,Python,SQL,AJAX');
SELECT`关键字`
从`主题`
其中,匹配(`keywords`)与布尔模式下的('+Ruby+Python');
+----------------------+
|关键词|
+----------------------+
|Ruby,Python|
|Ruby、Python、SQL、AJAX|
+----------------------+
一组2行(0.00秒)

如果您只是查找记录,则只需精确输入。您可以添加一个哈希列。例如,为Mysql表设计一个哈希表。因此,您可以在查询语句中使用哈希值。但是,如果您的
关键字
值已更改,请不要忘记更新哈希值。添加更新前触发器可能是一个不错的选择

创建表(如果不存在)`topic`(
`id`int(10)无符号非空自动增量,
`日期行`日期,
`作者varchar(30岁),
`信息`文本,
`关键词'varchar(255),
`关键词_hash`varchar(32),
主键(`id`),
全文(`keywords`)
)ENGINE=InnoDB默认字符集=utf8自动增量=1;
插入“主题”
(`keywords`、`keywords\u hash`)
值('Ruby,Python',md5('Ruby,Python');
SELECT`关键字`
从`主题`
其中`keywords_hash`=md5('Ruby,Python');

你说的我一点也不懂。请以表格格式提供你的示例数据(带有列名),准确地指定你在
$array
中拥有的内容(使用PHP语法),您得到的输出是什么,以及它与所需的输出有什么不同。一列怎么可能同时包含这两个值?我不认为这在给定的布局中是可能的。请看一看。@NicoHaase。根据
主题
表结构,每个主题不能有多个
辅助
,因此如何链接主题对于Python和Ruby?为每个术语生成单独的JOIN语句。但是,这假设您有一个实际的多对多关系,因为这在示例表中并不清楚。嗨!不使用全文是否可以获得相同的效果?使用
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);