MySQL,获取多行集合中一行的位置

我有这个查询,根据那里的{ "suites": 3,"tests": 3,"pending": 1,"root": { "title": "(root)","suites": [ { "title": "foo","suites": [ { "title": "bar","suites": [],"tests": [ { "title": "should do something","pending": false } ] },{ "title": "baz","tests": [ { "title": "should do something else","pending": true },{ "title": "should do another thing","pending": false } ] } ],"tests": [] } ],"tests": [] } } 计算publication在一组出版物(这里称为community)中的位置:

effective_publishing_date

结果为:

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

现在我有一个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; 的列表,它们分别具有feed_itemcommunity_id作为属性,我想为每个publication_id获取关联的{{1 }}。

例如,如果我有一个feed_item = 18且publication_rank = 2的publication_item,我希望publication_id#18中的community_id publication_rank#2的所有出版物。我无法一次查询(或通过子查询等)获得该信息。

感谢前进,

youxiwangluo 回答:MySQL,获取多行集合中一行的位置

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

  1. 仅适用于联接:
SELECT 
  g1.community_id,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.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;

enter image description here

  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),@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;
本文链接:https://www.f2er.com/3084585.html

大家都在问