如何用SQL语句包含同时包含多个标签?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

如何用SQL语句包含同时包含多个标签?

2016-07-01 15:16:13 2751 1

现在有三张数据表, 一张是书籍表, 一张是书籍的标签表, 由于数据与标签是多对多的关系, 所以还有一张中间表。 大概的结构如下:

书籍表 books

|id|name|
|001|BOOK001|
|002|BOOK002|
标签表 labels

|id|name|
|001|LABEL001|
|002|LABEL002|
中间表 book_label_maps

|id|book_id|label_id|
|001|001|001|
|002|001|002|
|003|002|001|
那么问题来了, 我怎么才能找出标记为LABEL001和LABEL002的呢? 这里也就是找出BOOK001.

PS. 由于在真实查询过程中标签的数量不固定, 所以, 最好能够将查询的LABEL id全都放到一个地方。

例如: select * from books where otherquery(laebl001, label002)

目前的解决办法(PHP):

$query = 'SELECT * FROM books WHERE ';
foreach( $labels as $index => $laeblID ) {
  $laebls[$index] => 'EXISTS (SELECT * FROM book_label_maps WHERE book_id = book.id AND laebl_id='.$laeblID.' )'
}
$laebls = implode(' AND ', $laebls);
$query .= $labels;
结果大概是这样的:

SELECT * FROM books 
WHERE 
  EXISTS (SELECT * FROM book_label_maps WHERE book_id = book.id AND label_id="001" ) 
  AND 
  EXISTS (SELECT * FROM book_label_maps WHERE book_id = book.id AND label_id="002")
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:50:06

    才开始学SQL不久,只不过前几天恰好遇到另外的问题,可能相比题主的方案那边的解决方案能用,也更好一些。 在我看来,题主的方法即使能行,但我感觉属于效率不高的,举个例子:100本书,每本书10个标签,你的WHERE下面的子查询都得查个1000次吧,接下来再说我之前遇到的问题。 我之前遇到的是合并行的问题,如果在你的例子中,我们就需要根据BookID把labels合并,就是需要下面的效果

       book_id|label_id
        001|001,002
        002|001
    然后在对这个结果集进行查询的时候就可以根据“001,002”这样的字符串匹配进行查询了。 我用的是oracle,贴上oracle可用的解决方案的SQL:
    
    SELECT bookID,LTRIM(MAX(SYS_CONNECT_BY_PATH(labelID,','))KEEP(DENSE_RANK LAST ORDER BY curr),',') AS labels
    FROM (
    SELECT labelID ,bookID
    ROW_NUMBER() OVER (ORDER BY bookID)  curr ,
    ROW_NUMBER() OVER (ORDER BY bookID) -1 prev 
    FROM book_label_maps) 
    GROUP BY bookID
    CONNECT BY prev = PRIOR curr AND bookID=bookID START WITH curr=1

    以上SQL语句可以通过你的MAPS表生成根据bookID聚合的表(我没有实际测试)。之前我搜索的时候也看到过MYSQL也有它的关于合并行的函数,你可以去看看。如果这种“包含几个标记的书”这样的需求很多的话,可以搞个视图,就生成合并行的结果集,然后之后这样的需求就都到视图里面查,省事。

    0 0
相关问答

4

回答

Spark 【问答合集】

社区小助手 2019-05-29 14:13:40 127205浏览量 回答数 4

10

回答

【精品问答合集】Hbase热门问答

hbase小能手 2019-05-29 14:37:26 120852浏览量 回答数 10

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 226203浏览量 回答数 162

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157740浏览量 回答数 145

38

回答

[@饭娱咖啡][¥20]对于慢sql有没有什么比较实用的诊断和处理方法?

江小白太白 2018-10-30 18:47:38 142111浏览量 回答数 38

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 147263浏览量 回答数 22

2

回答

mySQL数据库报错You have an error in your SQL syntax

落地花开啦 2016-02-14 16:09:24 129025浏览量 回答数 2

8

回答

flink sql 支持checkpoints吗?

游客izljdlkgbdwfc 2019-07-10 17:46:37 124011浏览量 回答数 8

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 305674浏览量 回答数 249

97

回答

Redhat/CentOS一键安装web环境全攻略

xiaofanqie 2011-08-11 14:51:38 123723浏览量 回答数 97
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载