MySQL,获取多行集合中一行的位置
我有一个查询,它计算了一个出版物在一组出版物中的位置,这些出版物在这里被命名为community,根据有效发布日期: 结果如下: [![在此处输入图像描述][1][1] 现在我有了一个feed_项列表,其中每个community_id和publication_id都是属性,我想为每个feed_项获取相关的publication_排名 例如,如果我有一个publication_项,publication_id=18,community_id=2,那么我需要publication_id 18在community_id 2的所有发布中的publication_排名。我不能在一个查询或子查询中成功地得到它MySQL,获取多行集合中一行的位置,mysql,sql,position,row,Mysql,Sql,Position,Row,我有一个查询,它计算了一个出版物在一组出版物中的位置,这些出版物在这里被命名为community,根据有效发布日期: 结果如下: [![在此处输入图像描述][1][1] 现在我有了一个feed_项列表,其中每个community_id和publication_id都是属性,我想为每个feed_项获取相关的publication_排名 例如,如果我有一个publication_项,publication_id=18,community_id=2,那么我需要publication_id 18在com
谢谢大家,这里是我最终找到的两个解决方案。感谢@Barmar 仅适用于连接: 使用SQL变量
以防万一。。。您使用的是哪个版本的MySQL?您好@GMB,我有MySQL 5.7.26,请参阅如何在组内获得排名。然后你可以加入你的feed_项目列表,以获得其在组中的排名。谢谢你@Barmar,我解决了我的问题,谢谢你的链接:-很好的研究和适应工作!
SELECT p.publication_id
, p.name publication_name
, IF(p.scheduled_at is not null, p.scheduled_at, p.created_at) effective_publishing_date
, @current_rank := @current_rank + 1 publication_rank
FROM publications p
JOIN (SELECT @current_rank := 0) r
WHERE p.community_id = 8513
ORDER
BY effective_publishing_date ASC;
SELECT
g1.community_id,
g1.publication_name,
g1.publication_name,
g1.publication_id,
COUNT(*) AS rank
FROM
(
SELECT
publications.publication_id as publication_id,
publications.name as publication_name,
publications.community_id as community_id,
communities.name as community_name,
IF(
publications.scheduled_at is not null,
publications.scheduled_at, publications.created_at
) as effective_publishing_date
FROM
feed_items
JOIN publications ON feed_items.publication_id = publications.publication_id
JOIN communities ON publications.community_id = communities.community_id
WHERE
feed_items.user_id = 489387
) AS g1
JOIN (
SELECT
publications.publication_id as publication_id,
publications.community_id as community_id,
IF(
publications.scheduled_at is not null,
publications.scheduled_at, publications.created_at
) as effective_publishing_date
FROM
feed_items
JOIN publications ON feed_items.publication_id = publications.publication_id
WHERE
feed_items.user_id = 489387
) AS g2 ON (
g2.effective_publishing_date, g2.publication_id
) <= (
g1.effective_publishing_date, g1.publication_id
)
AND g1.community_id = g2.community_id
GROUP BY
g1.publication_id,
g1.community_id,
g1.effective_publishing_date
ORDER BY
g1.community_id,
rank ASC;
SELECT data_table.publication_id, data_table.publication_name, data_table.community_id, data_table.effective_publishing_date,
@publication := IF(@community <> data_table.community_id, concat(left(@community := data_table.community_id, 0), 0), @publication+1) AS rank
FROM
(SELECT @publication:= -1) p,
(SELECT @community:= -1) c,
(SELECT
publication.name as publication_name,
publication.community_id as community_id,
feed_item.publication_id as publication_id,
IF(publication.scheduled_at is not null, publication.scheduled_at, publication.created_at) as effective_publishing_date
FROM feed_items feed_item
JOIN publications publication ON feed_item.publication_id = publication.publication_id
WHERE feed_item.user_id = 489387
ORDER BY publication.community_id, effective_publishing_date ASC
) data_table;