我目前正在为音乐网站编写一个基本的搜索系统,该系统使用标签(“ 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;

10-04 22:08
查看更多