был бы так добр и помог бы мне, или позвольте мне научиться решать эту проблему? У меня есть следующая мини-демонстрационная таблица:
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 ;
Правильный и желаемый результат должен быть таким
Когда я делаю явное решение с двумя 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 );
И вы увидите правильную и желаемую таблицу.
Цель состоит в том, чтобы сопоставить сходство (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;