我目前正在为音乐网站编写一个基本的搜索系统,该系统使用标签(“ Instrumental Duo”,“ Instrumental Trio”,“ latin”,.. ect)进行搜索。我正在尝试找出如何使用标签搜索MySQL数据库以限制结果。
这些表是要像这样关联的;
| Items | | Tags |
|----------| |----------|
| PK_Items | One - Many | FK_Items |
| Title | | PK_Tags |
| Writer | | Tag_txt |
表中的每个项目项目将在表中具有多个项目
简而言之,我希望能够为数据库提供标签集合,并使其返回所有匹配的项目
示例数据
该表已使用创建
CREATE TABLE Items
(
PK_Items int NOT NULL AUTO_INCREMENT,
Title TEXT,
Writer varchar(30),
PRIMARY KEY(PK_Items)
);
CREATE TABLE Tags
(
PK_Tags int NOT NULL,
FK_Items int NOT NULL,
Tag_Txt varchar(100),
PRIMARY KEY(PK_Type),
FOREIGN KEY(FK_Items) REFERENCES Items(PK_Items)
);
样本数据
+----------+-------------+------------------+
| <b>PK_Items</b> | <b>Title</b> | <b>Writer</b> |
+----------+-------------+------------------+
| 1 | Song1 | Joe Blogs |
+----------+-------------+------------------+
| 2 | Song2 | Joe Blogs |
+----------+-------------+------------------+
| 3 | Song3 | Jane Smith |
+----------+-------------+------------------+
+----------+-------------+------------------+
| <b>PK_Tags</b> | <b>FK_Items</b> | <b>Tag_Txt</b> |
+----------+-------------+------------------+
| 1 | 1 | Slow |
+----------+-------------+------------------+
| 2 | 1 | Jazz |
+----------+-------------+------------------+
| 3 | 2 | Fast |
+----------+-------------+------------------+
| 4 | 2 | Rock |
+----------+-------------+------------------+
| 5 | 3 | Slow |
+----------+-------------+------------------+
| 6 | 3 | Rock |
+----------+-------------+------------------+
如果我想搜索“慢速”,我应该让所有带有“慢速”标记的商品显示为
+----------+-------------+------------------+
| <b>PK_Items</b> | <b>Title</b> | <b>Writer</b> |
+----------+-------------+------------------+
| 1 | Song1 | Joe Blogs |
+----------+-------------+------------------+
| 3 | Song3 | Jane Smith |
+----------+-------------+------------------+
或者,如果我搜索“慢”和“摇滚”,我会得到
+----------+-------------+------------------+
| <b>PK_Items</b> | <b>Title</b> | <b>Writer</b> |
+----------+-------------+------------------+
| 3 | Song3 | Jane Smith |
+----------+-------------+------------------+
我试过了
SELECT *
FROM Items a
JOIN Type t ON t.FK_Items = a.PK_Items
WHERE t.Tag_txt = 'Slow';
这给出了(基本上)应该给出的内容,但是当使用“慢速”和“摇滚”时,我得到了一个空表。
SELECT *
FROM Items a
JOIN Type t ON t.FK_Items = a.PK_Items
WHERE t.Tag_txt = 'Slow' AND t.Tag_txt = 'Rock';
请帮忙
最佳答案
您可以使用having
子句执行此操作。这是一种方法:
SELECT i.*
FROM Items i JOIN
Type t
ON t.FK_Items = i.PK_Items
WHERE t.Tag_txt IN *'Slow', 'Rock')
GROUP BY i.PK_Items
HAVING COUNT(DISTINCT t.tag_txt) = 2;