Как я могу разрешить запуск этого Select для всех LD, хранящихся в тестовой таблице? - PullRequest
1 голос
/ 19 апреля 2020

был бы так добр и помог бы мне, или позвольте мне научиться решать эту проблему? У меня есть следующая мини-демонстрационная таблица:

     DROP TABLE IF EXISTS `test`;
     CREATE TABLE `test` (
       `recid` int(11) NOT NULL DEFAULT '0',
       `ScopusTI` varchar(855) DEFAULT NULL,
       `BIOGRAPHYTITLE` varchar(855) DEFAULT NULL,
       `LD` varchar(255) DEFAULT NULL,
       `BIOTIrecid` int(11) DEFAULT NULL,
       PRIMARY KEY (`recid`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     -- ----------------------------
     -- Records of test
     -- ----------------------------
     INSERT INTO `test` VALUES ('0', 'T1',     'T1a', '1', null);
     INSERT INTO `test` VALUES ('99', 'T1',     'T1b', '1', null);
     INSERT INTO `test` VALUES ('461', 'T2',   'T2aa', '2', null);
     INSERT INTO `test` VALUES ('3550', 'T3',  'T3a', '1', null);
     INSERT INTO `test` VALUES ('4202', 'T4',  'T4aa', '2', null);
     INSERT INTO `test` VALUES ('4979', 'T5',  'T5a', '1', null);
     INSERT INTO `test` VALUES ('10270', 'T6', 'T6aa', '2', null);
     INSERT INTO `test` VALUES ('17159', 'T7', 'T7aa', '2', null);
     INSERT INTO `test` VALUES ('23358', 'T8', 'T8a', '1', null);
     INSERT INTO `test` VALUES ('24113', 'T9', 'T9aa', '2', null);
     INSERT INTO `test` VALUES ('26326', 'T10', 'T10a', '1', null);

И теперь я хотел бы сделать этот выбор по всем LD в Базе данных: этот выбор отлично работает для t4.LD = 1, но я также хочу t4.LD = 2 или t4.LD = 3 .... et c.

     SELECT 
      t1.recid,
      t1.ScopusTI,
     BIOGRAPHYTITLE   ,t1.LD ,count(*) as az,t3.myrecids
     FROM test t1
     INNER JOIN (SELECT MIN(`LD`+0) MINLD,ScopusTI FROM test GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI AND t1.LD = t2.MINLD
     inner join (SELECT GROUP_CONCAT(recid) as myrecids , ScopusTI ,convert(LD,UNSIGNED) SELLD, t4.LD  from test t4 where t4.LD = 1 GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI and t3.LD = t2.MINLD 
     GROUP BY ScopusTI ORDER BY az desc, t1.`LD`+0 ;

Я думаю, что это будет сделано с помощью объединения. Но как? Я был бы благодарен, если бы я мог учиться из решения снова. Спасибо

РЕДАКТИРОВАТЬ: я пробовал это, но здесь столбец az не является правильным:

     SELECT 
         t1.recid,
         t1.ScopusTI,
         BIOGRAPHYTITLE   ,t1.LD ,count(*) as az,t3.myrecids
     FROM test t1
     cross join (select LD from test) tc
     INNER JOIN (SELECT MIN(`LD`+0) MINLD,ScopusTI FROM test GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI AND t1.LD = t2.MINLD
     inner join (SELECT GROUP_CONCAT(recid) as myrecids , ScopusTI ,convert(LD,UNSIGNED) SELLD, t4.LD  from test t4 GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI and t3.LD = t2.MINLD and t3.LD=tc.LD
     GROUP BY ScopusTI ORDER BY az desc, t1.`LD`+0 ;

Правильный и желаемый результат должен быть таким

desired Solution

Когда я делаю явное решение с двумя LD, которые будут выглядеть следующим образом:

   drop TABLE if EXISTS atest;
   create table atest (select * from test);

   SELECT * from(
   SELECT 
       t1.recid,
       t1.ScopusTI,
      t1.BIOGRAPHYTITLE   ,t1.LD ,count(*) as az,t3.myrecids
   FROM atest t1
   INNER JOIN (SELECT MIN(`LD`+0) MINLD,ScopusTI FROM atest GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI AND t1.LD = t2.MINLD
   inner join (SELECT GROUP_CONCAT(recid) as myrecids , ScopusTI ,convert(LD,UNSIGNED) SELLD, t4.LD  from atest t4 where t4.LD='1' GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI and t3.LD = t2.MINLD 
   GROUP BY ScopusTI ORDER BY az desc, t1.`LD`+0 )ts1 
   UNION (
   SELECT 
       t1.recid,
       t1.ScopusTI,
      t1.BIOGRAPHYTITLE   ,t1.LD ,count(*) as az,t3.myrecids
   FROM atest t1
   INNER JOIN (SELECT MIN(`LD`+0) MINLD,ScopusTI FROM atest GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI AND t1.LD = t2.MINLD
   inner join (SELECT GROUP_CONCAT(recid) as myrecids , ScopusTI ,convert(LD,UNSIGNED) SELLD, t4.LD  from atest t4 where t4.LD='2' GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI and t3.LD = t2.MINLD 
   GROUP BY ScopusTI ORDER BY az desc, t1.`LD`+0 );

И вы увидите правильную и желаемую таблицу.

correct table

Цель состоит в том, чтобы сопоставить сходство (LD = LevenshteinDistance) между BIOTitles и ScopusTI.

EDIT: одна маленькая ошибка, которую я обнаружил в ответе nbk, когда позволил он запускается на моем большом столе:

* * * * * * * * * * * * * * * * * * Во втором внутреннем соединении следует заменить group by LD,ScopusTI

, так что теперь это работает так, как должно:

   SELECT 
       t1.recid,
       t1.ScopusTI,
       BIOGRAPHYTITLE,
       t1.LD,
       t5.az AS az,
       t3.myrecids
   FROM
       test t1
           CROSS JOIN
       (SELECT 
           LD
       FROM
           test) tc
           INNER JOIN
       (SELECT 
           MIN(`LD` + 0) MINLD, ScopusTI
       FROM
           test
       GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI
           AND t1.LD = t2.MINLD
           INNER JOIN
       (SELECT 
           GROUP_CONCAT(recid) AS myrecids,
               ScopusTI,
               CONVERT( LD , UNSIGNED) SELLD,
               t4.LD
       FROM
           test t4
       GROUP BY LD,ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI
           AND t3.LD = t2.MINLD
           AND t3.LD = tc.LD
       INNER JOIN
       (SELECT
            COUNT(ScopusTI) AS az,
            ScopusTI, LD
        FROM test
        GROUP BY ScopusTI,LD
        ) t5 ON t1.ScopusTI = t5.ScopusTI AND t1.LD = t5.LD   
   GROUP BY ScopusTI
   ORDER BY az DESC , t1.`LD` + 0;

1 Ответ

1 голос
/ 20 апреля 2020

Это дает желаемый результат.

Но я не понимаю, какая разница, если бы у вас было 2 или 10 LD.

Количество ScopusTI теперь подсчитывается для полных строк, без различия между LD, это потому, что T1 не появился в 2.

SELECT 
    t1.recid,
    t1.ScopusTI,
    BIOGRAPHYTITLE,
    t1.LD,
    t5.az AS az,
    t3.myrecids
FROM
    test t1
        CROSS JOIN
    (SELECT 
        LD
    FROM
        test) tc
        INNER JOIN
    (SELECT 
        MIN(`LD` + 0) MINLD, ScopusTI
    FROM
        test
    GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI
        AND t1.LD = t2.MINLD
        INNER JOIN
    (SELECT 
        GROUP_CONCAT(recid) AS myrecids,
            ScopusTI,
            CONVERT( LD , UNSIGNED) SELLD,
            t4.LD
    FROM
        test t4
    GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI
        AND t3.LD = t2.MINLD
        AND t3.LD = tc.LD
    INNER JOIN
    (SELECT
         COUNT(ScopusTI) AS az,
         ScopusTI
     FROM test
     GROUP BY ScopusTI
     ) t5 ON t1.ScopusTI = t5.ScopusTI   
GROUP BY ScopusTI
ORDER BY az DESC , t1.`LD` + 0;

После некоторого рассмотрения и вашего настаивания на разных LD.

Это также учитывает только ScorpusTI на LD. Поскольку он получает тот же результат, но будет отличаться, когда один и тот же ScorTI коррелирует с разными LS

SELECT 
    t1.recid,
    t1.ScopusTI,
    BIOGRAPHYTITLE,
    t1.LD,
    t5.az AS az,
    t3.myrecids
FROM
    test t1
        CROSS JOIN
    (SELECT 
        LD
    FROM
        test) tc
        INNER JOIN
    (SELECT 
        MIN(`LD` + 0) MINLD, ScopusTI
    FROM
        test
    GROUP BY ScopusTI) t2 ON t1.ScopusTI = t2.ScopusTI
        AND t1.LD = t2.MINLD
        INNER JOIN
    (SELECT 
        GROUP_CONCAT(recid) AS myrecids,
            ScopusTI,
            CONVERT( LD , UNSIGNED) SELLD,
            t4.LD
    FROM
        test t4
    GROUP BY ScopusTI) t3 ON t1.ScopusTI = t3.ScopusTI
        AND t3.LD = t2.MINLD
        AND t3.LD = tc.LD
    INNER JOIN
    (SELECT
         COUNT(ScopusTI) AS az,
         ScopusTI, LD
     FROM test
     GROUP BY ScopusTI,LD
     ) t5 ON t1.ScopusTI = t5.ScopusTI AND t1.LD = t5.LD   
GROUP BY ScopusTI
ORDER BY az DESC , t1.`LD` + 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...