首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在需要包含多个联接行的情况下执行SQL联接

如何在需要包含多个联接行的情况下执行SQL联接
EN

Stack Overflow用户
提问于 2018-10-13 23:30:21
回答 3查看 130关注 0票数 2

当我的站点上有人搜索一个有多个标签的图像时,我需要查询并找到所有有搜索标记的图像,但似乎无法理解这个查询。

我有一张Images桌。

Images表与Posts_Images有关系。

Posts_Images将与Posts表有关联。

PostsPosts_Tags表有关系。

Posts_Tags表将具有与Tags表的关系。

到目前为止,我提出的问题是:

代码语言:javascript
复制
  SELECT "images".* FROM "images"
      INNER JOIN "posts_images" ON posts_images.image_id = images.id
      INNER JOIN "posts" ON posts.id = posts_images.post_id AND posts.state IS NULL 
      INNER JOIN "posts_tags" ON posts_tags.post_id = posts.id
      INNER JOIN "tags" ON posts_tags.tag_id = tags.id
    WHERE (("images"."order"=0) AND ("images"."has_processed"=TRUE)) AND (LOWER(tags.tag)='comic') AND ("tags"."tag" ILIKE '%Fallout%') ORDER BY "date_uploaded" DESC LIMIT 30

它没有得到任何结果,它正在检查tags是否等于两个值,但是我想看看加入的tags中是否有我需要的所有值。

所需的结果将是具有匹配ComicILIKE '%Fallout%'的标记的任何ILIKE '%Fallout%'

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-14 03:44:36

你似乎想要这样的东西:

代码语言:javascript
复制
SELECT i.*
FROM images JOIN
     posts_images pi
     ON pi.image_id = i.id JOIN
     posts p
     ON p.id = pi.post_id AND p.state IS NULL JOIN 
     posts_tags pt
     ON pt.post_id = p.id JOIN
     tags t
     ON pt.tag_id = t.id
WHERE i."order" = 0 AND
      i.has_processed AND
      (LOWER(t.tag) = 'comic') OR
       (t.tag ILIKE '%Fallout%')
GROUP BY i.id
HAVING COUNT(DISTINCT tag) >= 2
ORDER BY date_uploaded DESC
LIMIT 30;

逻辑在HAVING子句中。我不是百分之百确定这正是你想要的多场比赛。

票数 2
EN

Stack Overflow用户

发布于 2018-10-15 06:52:08

除了gordon-linoff的响应查询之外,还可以使用ActiveQuery来描述:

代码语言:javascript
复制
Images::find()
    ->alias('i')
    ->joinWith([
        'postsImages pi',
        'postsImages.posts p',
        'postsImages.posts.tags t'
    ])
    ->where([
        'p.state' => null,
        'i.order' => 0,
        'i.has_processed' => true,
    ])
    ->andWhere(
        'or'
        'LOWER(t.tag) = "comic"',
        ['like', 't.tag', 'Fallout']
    ])
    ->groupBy('id')
    ->having('COUNT(DISTINCT tag) >= 2')
    ->orderBy('date_uploaded DESC')
    ->limit(30)
    ->all()
票数 2
EN

Stack Overflow用户

发布于 2018-10-15 17:16:24

代码语言:javascript
复制
   $images = Images::find()
        ->innerJoin('posts_images', 'posts_images.image_id = images.id')
        ->innerJoin('posts', 'posts.id = posts_images.post_id AND posts.state IS NULL')
        ->where(['images.order' => 0, 'images.has_processed' => true]);

    if (!is_null($query)) {
        $tags = explode(',', $query);
        $images = $images
            ->innerJoin('posts_tags', 'posts_tags.post_id = posts.id')
            ->innerJoin('tags', 'posts_tags.tag_id = tags.id');

        $tagsQuery = ['OR'];
        foreach ($tags as $tag) {
            $tag = trim(htmlentities($tag));
            if (strtolower($tag) == 'comic') {
                $tagsQuery[] = ['tags.tag' => $tag];
            } else {
                $tagsQuery[] = [
                    'ILIKE',
                    'tags.tag', $tag
                ];
            }
        }

        if (!empty($tagsQuery)) {
            $images = $images->andWhere($tagsQuery)
                ->having('COUNT(DISTINCT tags.tag) >= ' . sizeof($tags));

        }
    }
    $images = $images
        ->groupBy('images.id')
        ->orderBy(['date_uploaded' => SORT_DESC])
        ->offset($offset)
        ->limit($count);

    return $images->all();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52798227

复制
相关文章

相似问题

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