首页 > 解决方案 > 我可以在 MySQL 的 where 子句中有不同的选择吗?

问题描述

我在 MySQL 中有一个返回 ID 列表的选项。代码如下:

select 
    distinct(cit.cited_article_id) 
from gp_citation as cit,
    (SELECT id, collection_id, year,
        collection_name,
        collection_volume, collection_number, title,
        is_international_relations, is_book_review, gp_status
        FROM gp_publication
        WHERE (collection_id = 1304 OR collection_id = 577
        OR collection_ID = 387 OR collection_ID = 19
        OR collection_ID = 5739 OR collection_ID = 6245
        OR collection_ID = 6246 OR collection_ID = 6522
        OR collection_ID = 6524 OR collection_ID = 6526
        OR collection_ID = 6527 OR collection_ID = 6528
        OR collection_ID = 6529 OR collection_ID = 6530
        OR collection_ID = 6531 OR collection_ID = 150
        OR collection_ID = 6525)
        AND (year >= 2011 AND year <= 2015)
        AND is_international_relations = 1
        AND is_book_review = 0
    ) as pub
where
    pub.id = cit.citing_article_id;

现在我不想得到被引用的_article_id,而是得到gp_publication 选择,但是我无法改变选择,因为我有一个不同的ID 列表从gp_publication 中选择条目。

结果应包含来自 gp_publications 的 id、collection_id、collection_numer 等。

我可能可以使用返回 ID 的完整语句作为 where 子句,例如

... where pub.id = < returned list of ids from above statement >

但是有没有更好的方法来做到这一点而无需从同一张表中选择两次?gp_citation 有重复,所以我需要使用 distinct()。

标签: mysql

解决方案


似乎我们可以在gp_citation. 内联视图查询可以包含DISTINCTSELECT 列表中的关键字,也可以使用GROUP BY函数和聚合。

从提供的信息中不清楚要消除哪些“重复”。

保持内联视图不变pub,我们可以连接到内联视图:

 SELECT pub.*
      , cit.*
   FROM ( SELECT p.id
               , p.collection_id
               , p.year
               , p.collection_name
               , p.collection_volume
               , p.collection_number
               , p.title
               , p.is_international_relations
               , p.is_book_review
               , p.gp_status
            FROM gp_publication p
           WHERE p.collection_id IN (1304,577,387,19,5739,6245,6246,6522,6524,6526,6527,6528,6529,6530,6531,150,6525)
             AND p.year                      >= 2011 
             AND p.year                      <= 2015
             AND p.is_international_relations = 1
             AND p.is_book_review             = 0
        ) pub
   JOIN ( SELECT c.cited_article_id
               , c.citing_article_id
            FROM gp_citation c
           GROUP
              BY c.cited_article_id
               , c.citing_article_id
        ) cit
     ON cit.citing_article_id = pub.id
  ORDER
     BY ...

我的期望是一篇文章可以被其他几篇文章“引用”......也就是说,可以有多行gp_citation相同cited_article_id和不同的citing_article_id.

如果目标是避免返回“重复”行gp_publication,假设id是唯一标识符,我们可以这样做:

 SELECT pub.id
      , pub.collection_id
      , pub.year
      , pub.collection_name
      , pub.collection_volume
      , pub.collection_number
      , pub.title
      , pub.is_international_relations
      , pub.is_book_review
      , pub.gp_status
   FROM ( SELECT p.id AS pub_id
            FROM ( SELECT c.cited_article_id
                        , c.citing_article_id
                     FROM gp_citation cit
                    GROUP
                       BY c.cited_article_id
                        , c.citing_article_id
                 ) cit
            JOIN gp_publication p
              ON p.id = cit.citing_article_id
           WHERE p.collection_id IN (1304,577,387,19,5739,6245,6246,6522,6524,6526,6527,6528,6529,6530,6531,150,6525)
             AND p.year                      >= 2011 
             AND p.year                      <= 2015
             AND p.is_international_relations = 1
             AND p.is_book_review             = 0
           GROUP
              BY p.id
        ) cc
   JOIN gp_publication pub
     ON pub.id = cc.pub_id
  ORDER
     BY ...

推荐阅读