【问题标题】:MySQL Statement without a JOIN没有 JOIN 的 MySQL 语句
【发布时间】:2011-07-03 21:15:56
【问题描述】:

我有一个 MySQL 表,我正在尝试查询articles_data,但我不想对其他表进行任何连接。

它有行:

article_id  doc_type  doc_type_id
1           1         2
1           2         1
2           1         2
3           1         2
3           2         1

我正在尝试编写一个查询,该查询将返回 doc_type 为 1 且 doc_type_id 为 2 并且它具有相同 article_id 的另一行,其中 doc_type 为 2 且 doc_type_id 为 1 所以在上面的示例中,我试图返回 article_id 1 和 3。

任何想法我将如何编写一个 SQL 查询来做到这一点?

【问题讨论】:

  • 您可能可以使用子查询,但最简单的是使用 JOIN。您想避免 JOIN 的任何特殊原因?

标签: mysql join where


【解决方案1】:

您不必加入其他表,但可以通过自联接来完成

这是我的想法,您可能需要调整语法

select distinct article_id
from articles_data a
join articles_data b on b.articles_id = a.articles_id
where a.doc_type = 1 and a.doc_type_id = 2
and b.doc_type = 2 and b.doc_type_id = 1

【讨论】:

    【解决方案2】:
    SELECT article_id
    FROM article_data
    WHERE (doc_type = 1 AND doc_type_id = 2)
       OR (doc_type = 2 AND doc_type_id = 1)
    GROUP BY article_id
    HAVING COUNT(DISTINCT doc_type) = 2 AND COUNT (DISTINCT doc_type_id) = 2
    

    【讨论】:

      【解决方案3】:
      select distinct article_id
      from articles_data ad
      where 
          doc_type = 1 and 
          doc_type_id = 2 and
          article_id in (
              select article_id 
              from articles_data
              where 
                  article_id = ad.article_id and 
                  doc_type = 2 and 
                  doc_type_id = 1
          )
      

      【讨论】:

      • 这将返回所有三个 article_id 值,不是吗?
      • @karolis:article_id = ad.article_id and 应该被删除。
      • @ypercube 这不是必需的,但是这样查询会更快。无论如何,我认为这是一个家庭作业,所以任何决定都是好的。
      【解决方案4】:
      SELECT DISTINCT article_id
      FROM article_data ad
      WHERE doc_type = 1
        AND doc_type_id = 2
        AND EXISTS
          ( SELECT *
            FROM article_data ad2
            WHERE ad2.doc_type = 2
              AND ad2.doc_type_id = 1
              AND ad2.article_id = ad.article_id
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-13
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多