mysql - 我可以在 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()。
解决方案
似乎我们可以在gp_citation
. 内联视图查询可以包含DISTINCT
SELECT 列表中的关键字,也可以使用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 ...
推荐阅读
- c++ - unordered_map Vs map Vs array - 内存分析
- jquery - 是否可以弯曲滑块(html css)
- cuda - 我可以让 nvlink 列出它实际使用的库吗?
- python - 如何与 discord.py 中的附加图像进行交互
- javascript - 如何将参数从javascript传递给Ajax函数
- javascript - 突出显示的输入文本不会在按键时更新
- python - Python,macOS - 如何创建文件的查找器别名?
- css - 更改输入焦点上的边框
- google-chrome - 仅 Chrome 上的 SVG 平铺间隙
- batch-file - 如何使用 WinSCP 连续上传文件