mysql - 困难的 MySQL 问题(关系和多行)

标签 mysql database relational-database

我有一个困难的 mysql 问题。我有一个将关键字与案例相匹配的数据库,经过简化:

TABLE cases (id)
TABLE keywords (id)
TABLE cases_keywords (case, keyword)

所以我可以有带有关键字 Y 和 Z 的情况 A,也可以有带有关键字 X 和 Y 的情况 B。这在 case_keywords 中给出了四行:

(A, Y)
(A, Z)
(B, X)
(B, Y)

问题:

我的网站上有一个搜索功能,用户可以输入关键字进行搜索。我希望当找到所有关键字时结果显示匹配项。因此,当用户输入 Y 和 Z 作为关键字时,只会出现情况 A(因为情况 B 没有关键字 Z)。但是,当用户仅提供 Y 作为关键字时,网站会同时显示 A 和 B(因为它们都获得了关键字 Y)。

所以我知道查询是通过 PHP 动态进行的,最大的问题是匹配多个关键字...假设我想匹配 2 个关键字:Y 和 Z,结果为:case A。

如何将其编程为查询?如何匹配多行?

SELECT C.id FROM cases C JOIN cases_keywords CK ON CK.case = C.id WHERE CK.keyword = Y AND CK.keyword = Z

上面不起作用,所以我尝试了 WHERE C.case IN () 的一些东西,但我也被困在那里......

谁能帮帮我

最佳答案

这里有 2 个建议。

第一个必须动态构建,效率不会那么高,但很容易理解。

SELECT C.id 
FROM cases C 
JOIN cases_keywords CK1 ON CK1.case = C.id AND CK1.keyword = Y
JOIN cases_keywords CK2 ON CK2.case = C.id AND CK2.keyword = Z

更高效并且可以非动态构建:-

SELECT C.id, COUNT(CK.keyword) AS KeywordCount
FROM cases C 
JOIN cases_keywords CK ON CK.case = C.id
WHERE CK.keyword IN ('Y', 'Z')
GROUP BY C.id
HAVING KeywordCount = 2

关于mysql - 困难的 MySQL 问题(关系和多行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21454006/

相关文章:

mysqldump : Couldn't execute. information_schema 中的未知表 'column_statistics'

mysql - facebook 中的图表和 MYSQL 数据库之间的区别?

php - 为什么不能将相同的 ID 插入到 MySQL 表的 'id' 列中?

sql - 准备好的语句中 where = ?, where in (?) 子句的最佳实践?

database - 根据某种模式将文件拆分为多个文件并获取一些信息

java - GWT 的 MSI 文件,包括。数据库和Tomcat?

database-design - 数据库设计 - 多个实体的类似联系信息

mysql - 为什么要在所需的数据库列上设置 `null: false, default: ""`?

java - 如何从servlet中的html表中检索数据并将其插入数据库

php - 将来自 mySQL 的 PDO 请求输出到下拉选择器列表中