MariaDB - 通过更多选择

时间:2017-03-26 20:01:05

标签: select tags mariadb

我有这个SQL:

select * from `posts` 
where `posts`.`deleted_at` is null 
and `expire_at` >= '2017-03-26 21:23:42.000000' 
and (
select count(distinct tags.id) from `tags` 
inner join `post_tag` on `tags`.`id` = `post_tag`.`tag_id` 
where `post_tag`.`post_id` = `posts`.`id` 
and (`tags`.`tag` like 'PHP' or `tags`.`tag` like 'pop' or `tags`.`tag` like 'UI')
) >= 1

是否可以按帖子中的标签数量排序结果? 也许添加别名?

任何信息都可以帮助我。

1 个答案:

答案 0 :(得分:1)

将关联子查询转换为连接:

select p.*
from posts p
join (
    select pt.post_id,
        count(distinct t.id) as tag_count
    from tags t
    inner join post_tag pt on t.id = pt.tag_id
    where t.tag in ('PHP', 'pop', 'UI')
    group by pt.post_id
    ) pt on p.id = pt.post_id
where p.deleted_at is null
    and p.expire_at >= '2017-03-26 21:23:42.000000'
order by pt.tag_count desc;

另请注意,我将likeor的一堆更改为单IN,因为您没有匹配任何模式,即字符串中没有%。因此,最好使用单IN

此外,如果您已经定义了表名,列名等,并记住关键字等,则不需要使用反引号。他们使阅读查询变得困难。