Mysql 仅获取表中存在的行?

Mysql 仅获取表中存在的行?,mysql,sql,select,exists,Mysql,Sql,Select,Exists,我需要从table:Announcements中选择所有行,其中table Categories\u Announcements中存在行,用户按条件: Categories\u user.category\u id=Categories\u announcements.category\u id 我尝试了SQL查询,看到了吗 它应该只返回我一行Announcements.id=1,因为用户在Categories\u user.category\u id中只有一个类别 编辑: 我已经测试了您共享的

我需要从table:Announcements中选择所有行,其中table Categories\u Announcements中存在行,用户按条件:

Categories\u user.category\u id=Categories\u announcements.category\u id

我尝试了SQL查询,看到了吗

它应该只返回我一行Announcements.id=1,因为用户在Categories\u user.category\u id中只有一个类别

编辑: 我已经测试了您共享的SQL,因此这是一个查询:

select *
from `announcements`
where exists (
        select 1
        from `announcement_category`
        inner join `user_category` on `user_category`.`category_id` = `announcement_category`.`category_id`
        where `Auser_category`.`user_id` = 1
            and `announcement_category`.`announcement_id` = announcements.id
        )
它返回一个错误:


1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,了解第7行“LIMIT 0,25”附近要使用的正确语法。您需要将子查询与公告表关联起来:

select *
from Announcements a
where exists (
        select 1
        from Categories_announcements ca
        inner join Categories_user cu on cu.category_id = ca.category_id
        where cu.user_id = 1
            and ca.announcement_id = a.id
        )

你很接近。试试这个:

select a.*
from Announcements a
where exists (select 1
              from Categories_announcements ca join
                   Categories_user cu
                   on cu.category_id = ca.category_id 
              where ca.announcement_id = a.id and
                    cu.user_id = 1
             );
注:

缺少的关键是外部查询ca.announcement\u id=a.id的correlation子句。 左连接是多余的。where子句将其转换为内部联接。 表别名使查询更易于编写和读取。
您的查询缺少外部查询中的公告表与内部查询中的条件之间的关系:

SELECT *
FROM   announcements a
WHERE  EXISTS (SELECT    * 
               FROM      categories_announcements ca
               LEFT JOIN categories_user cu ON cu.category_id = ca.category_id 
               WHERE     cu.user_id = 1 AND
                         a.id = ca.announcement_id -- Here!
              ) 

我认为您不需要EXISTS子查询。基本的join语句应该可以工作

select a.* 
from Categories_user cu
join Categories_announcements ca on ca.category_id = cu.category_id
join Announcements a on a.id = ca.announcement_id
where cu.user_id = 1

没有子查询的另一种可能的解决方法:

SELECT a.id AS accouncement_id, a.name AS annoucement_name 
FROM Categories_user cu
INNER JOIN Categories_announcements ca 
        ON  cu.category_id = ca.category_id
        AND cu.user_id = 1
INNER JOIN Announcements a 
        ON ca.announcement_id = a.id;

使用SQLFiddle很好。但是你也应该在你的问题中添加查询。那么性能呢?这是1000条公告的速度请求吗?你能帮我用Laravel eloquent写下这个查询吗?@Darama如果你想要一个有说服力的解决方案,你需要先定义模型和关系。但我不会改变这个问题太多,因为你已经得到了很多答案。写一个标有laravel的新问题。定义关系后,答案可能很简单,如$user->announcements;。