php - 使用内部连接为三个表编写 mysql 查询

标签 php mysql inner-join aliases

我有以下完美运行的查询:

SELECT * 
FROM contacts 
WHERE id in (

             SELECT DISTINCT contacts.id 
               FROM contacts 
             INNER JOIN contacts2tags 
                ON contacts.id = contacts2tags.contactid 
            WHERE tagid in(7,4)
                 )  

此处contacts 表包含id、first_name、last_name、..和tags 表包含id、name。 contacts2tags表包含contactid和tagid,分别与contacts.id和tags.id相同

现在,我想要的是只显示同时具有 tagid 7 和 tagid 4 的联系人。 我试过这样的事情:

SELECT * 
FROM contacts
WHERE id IN
    (
     SELECT CT1.contactid 
 FROM
tags T1, contacts2tags CT1, tags T2, contacts2tags CT2
WHERE CT1.contactid = CT2.contactid
 AND CT1.tagid = T1.id
 AND CT2.tagid = T2.id
 AND (T1.id = 7 AND T2.id = 4)

而且它也有效。 我的问题是,我想将上面的第二个查询转换为使用内部联接的查询。 我在 php 中的 $tmp 中存储了一组 id 我想使用这些 ID 并为它们编写上面的查询。 我怎么做?我对 sql 不满意。可能是一个非常简单的问题。 提前致谢

编辑: 下面的答案解决了这个问题。但是对于 10k 条记录,sql 运行速度非常慢。有什么优化建议吗?粘贴答案中给出的更新查询。

    SELECT c.id 
     FROM contacts c
    inner join contacts2tags t on c.id = t.contactid 
    where t.tagid in (7,4)
    group by c.id
    having count(distinct t.tagid) = 2

最佳答案

这应该可行

SELECT c.id 
FROM contacts c
inner join contacts2tags t on c.id = t.contactid 
where t.tagid in (7,4)
group by c.id
having count(distinct t.tagid) = 2

关于php - 使用内部连接为三个表编写 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19376087/

相关文章:

php - 如何在只允许我访问的情况下将站点置于维护模式?

php - 使用 boolean 运算符扩展 EvalMath

php - 上传临时用的图片需要mysql数据库吗?

Mysql - 内连接 - 获取非关联结果

sql - 如何编写从 LEFT JOIN 结果中减去 INNER JOIN 结果的 SQL 查询?

sql - 用另一个表 SQL Server 中的值替换列中的 NA

php - Doctrine + Twig,如何在有限制的 OneToMany 关系中显示 Doctrine 集合?

php - MySQL 和 PHP 数据库?

mysql - 在 MySQL 中删除数据库时出错(不能 rmdir '.\oro',errno : 41)

mysql - 使查询返回空字符串值而不是嵌套查询的空结果集