首页 > 解决方案 > MySQL,获取多行集合中一行的位置

问题描述

我有这个查询来计算 apublication在一组出版物(这里命名为community)中的位置,根据那里effective_publishing_date

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;

结果为:

[![在此处输入图像描述][1]][1]

现在我有一个列表,feed_item其中包含 eachcommunity_idpublication_idas 属性,我想为每个 获取feed_item关联的publication_rank.

例如,如果我有一个publication_itemwith publication_id= 18 和community_id= 2,我想要#2的所有出版物中的 # publication_rank18 。我没有成功在一个查询(或子查询等)中得到它。publication_idcommunity_id

感谢提前,

标签: mysqlsqlpositionrow

解决方案


这是我最终找到的两个解决方案。感谢@Barmar!

  1. 仅使用连接:
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;

在此处输入图像描述

  1. 使用 SQL 变量
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;

推荐阅读