MySQL 从第二行中选择

标签 mysql

我有三个包含书籍和标签的表格。一本书可以标记多个标签。

我想做的是过滤掉同时标记为“漫画”和“浪漫”的书籍。

  1. 第一本书仅标记为“漫画”。
  2. 第二本书同时带有“漫画”和“浪漫”标签,因此我们的示例中应返回这一行。
  3. 第三本书仅标记为“奇幻”。

如何构建正确的查询来查找第二本书?

..select book_id from books b, tags t, tags_to_books tb where ((FIND TAGS_ID '7' AND '8'))..

表格设计:

DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
  `book_id` int(11) NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`book_id`)
 );

 INSERT INTO `books` (`book_id`)
 VALUES
(1),
(2),
(3);

 DROP TABLE IF EXISTS `tags`;
 CREATE TABLE `tags` (
   `tag_id` int(11) NOT NULL AUTO_INCREMENT,
   `tag_name` varchar(11) NOT NULL DEFAULT '',
   PRIMARY KEY (`tag_id`)
 );

 INSERT INTO `tags` (`tag_id`, `tag_name`)
 VALUES
(7,'Comics'),
(8,'Romance'),
(9,'Fantasy');

 DROP TABLE IF EXISTS `tags_to_books`;
 CREATE TABLE `tags_to_books` (
   `book_id` int(11) NOT NULL,
   `tag_id` int(11) NOT NULL
 );

 INSERT INTO `tags_to_books` (`book_id`, `tag_id`)
 VALUES
(1,7),
(2,7),
(2,8),
(3,9);

最佳答案

您可以使用类似这样的东西,它实际上与其他 SQL 语言中的交集运算符相同:

select comics.book_id from (
select b.book_id
  from books b
  join tags_to_books tb on tb.book_id = b.book_id
  join tags t on tb.tag_id = t.tag_id
  where t.tag_id = 7) as comics
join (
select b.book_id
  from books b
  join tags_to_books tb on tb.book_id = b.book_id
  join tags t on tb.tag_id = t.tag_id
  where t.tag_id = 8) as romance
on comics.book_id = romance.book_id

这可能可以稍微优化一下,但我们的想法是先获取 Fantasy 中的所有书籍,然后获取 Romance 中的所有书籍,然后返回两者中的书籍。如果您需要在需要更多条件的地方创建查询,您只需复制 JOIN 子句并更新标签 ID。

Link to SQL fiddle

关于MySQL 从第二行中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18254631/

相关文章:

mysql - 如果它们具有相同的行数,如何基于 order_id 内部连接表

php - MySQL 的 CHAR 数据类型是否有可以存储超过 255 个字符的固定长度版本?

php - 抓取时无法加载太大的 html 文件

使用 mysqltuner.pl 的结果调整 mysql 性能

php - 将复选框更新到 mysql 数据库

mysql - 使用表 B 中的分组/排序数据从表 A 中进行选择

mysql - 使用 MySQL 将一个表连接到另一个表中的最新行

使用 .frm 文件和 ibdata 文件恢复 MySQL InnoDB 数据库

php - 在 php 中为 html 表上的行添加删除按钮

mysql - 如何在 sql 中创建循环,这是这里最好的技术吗?