首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在查询中再添加一个join,该查询有GROUP和which子句?

问如何在查询中再添加一个join,该查询有GROUP和which子句?
EN

Stack Overflow用户
提问于 2018-06-18 14:17:36
回答 3查看 47关注 0票数 0

以下是我的疑问:

代码语言:javascript
复制
SELECT p.*
FROM posts p
INNER JOIN tags_pivot tp 
     ON p.id = tp.post_id
INNER JOIN tags t
     ON t.id = tp.tag_id AND t.name IN ('mysql', 'php')
GROUP BY p.id
HAVING COUNT(*) = 2;

它选择所有带有[mysql]和[php]标记的帖子。我还有一个叫"Category"的存在。这有点像"Tags",只是每个帖子都是唯一的。

无论如何,我需要将其附加到上面的查询中:

代码语言:javascript
复制
INNER JOIN category_pivote cp
        ON p.id = cp.post_id
INNER JOIN categories c
        ON c.id = cp.category_id AND c.name = "technology"

我如何组合这两个查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-18 14:22:35

使用joins的一种方法是:

代码语言:javascript
复制
SELECT p.*
FROM posts p INNER JOIN
     category_pivote cp
     ON p.id = cp.post_id INNER JOIN
     categories c
     ON c.id = cp.category_id AND c.name = 'technology' INNER JOIN
     tags_pivot tp 
     ON p.id = tp.post_id INNER JOIN
     tags t
     ON t.id = tp.tag_id AND t.name IN ('mysql', 'php')
GROUP BY p.id
HAVING COUNT(DISTINCT t.name) = 2;

我添加了DISTINCT,以防止多个类别匹配(尽管这似乎不太可能)。您还可以使用:

代码语言:javascript
复制
HAVING GROUP_CONCAT(DISTINCT t.name ORDER BY t.name) = 'mysql,php';
票数 2
EN

Stack Overflow用户

发布于 2018-06-18 14:22:11

要将另一个枢轴关系添加到现有的pivot查询中,可以按常规方式添加这些联接,但您需要更新having子句,以便只获取不同的标记ids。

代码语言:javascript
复制
SELECT p.id, p.name
FROM posts p
INNER JOIN tags_pivot tp 
     ON p.id = tp.post_id
INNER JOIN tags t
     ON t.id = tp.tag_id
INNER JOIN category_pivote cp
        ON p.id = cp.post_id
INNER JOIN categories c
        ON c.id = cp.category_id
WHERE t.name IN ('mysql', 'php')
AND c.name = "technology"
GROUP BY p.id, p.name
HAVING COUNT(DISTINCT t.id) = 2;

上面的查询将返回那些具有“mysql”、“php”标签和post是“技术”类别的帖子。

此外,在select列表中只包含那些列,这些列存在于group子句中,因为较新版本的mysql将拒绝这些查询。

票数 2
EN

Stack Overflow用户

发布于 2018-06-18 14:24:32

CTE应该在MySQL 5.5及更高版本上工作:

代码语言:javascript
复制
with x as (
  SELECT p.*
  FROM posts p
  INNER JOIN tags_pivot tp 
       ON p.id = tp.post_id
  INNER JOIN tags t
       ON t.id = tp.tag_id AND t.name IN ('mysql', 'php')
  GROUP BY p.id
  HAVING COUNT(*) = 2
)
select * from x
  INNER JOIN category_pivote cp
        ON x.id = cp.post_id
  INNER JOIN categories c
        ON c.id = cp.category_id AND c.name = "technology";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50911524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档