Я считаю, что вам нужно использовать INNER JOIN
с DISTINCT
здесь:
SELECT distinct uns.*
FROM uniquestructures as uns
INNER JOIN uniqueproteins as unp on uns.ProteinID = unp.ProteinId
where LENGTH(unp.PDBASequence) < 20;
Кроме того, вы можете испытать некоторую радость, если создадите отдельный столбец в таблице uniqueproteins
для хранения длины столбца PDBASequence
(например, PDBASequenceLength
). Затем вы можете поместить индекс в столбец PDBASequenceLength
вместо вызова LENGTH(PDBASequence)
в своем запросе. Если данные не являются статичными, создайте триггер для заполнения столбца PDBASequenceLength
каждый раз, когда строка вставляется или обновляется в таблицу uniqueproteins
. Следовательно:
CREATE TRIGGER uniqueproteins_length_insert_trg
AFTER INSERT ON uniqueproteins FOR EACH ROW SET NEW.PDBASequenceLength = length(new.PDBASequence);
CREATE TRIGGER uniqueproteins_length_update_trg
AFTER UPDATE ON uniqueproteins FOR EACH ROW SET NEW.PDBASequenceLength = length(new.PDBASequence);
alter table uniqueproteins add key `uniqueproteinsIdx2` (PDBASequenceLength);
Ваш запрос может быть таким:
SELECT uns.*
FROM uniquestructures as uns
INNER JOIN uniqueproteins as unp on uns.ProteinID = unp.ProteinId
where unp.PDBASequenceLength < 20;
Удачи!