Как получить записи таблицы, чьи идентификаторы взяты из оператора select

У меня есть две таблицы. Я пытаюсь выбрать несколько записей из одной из них. Затем часть идентификатора этого выбора должна использоваться для выбора некоторых записей другой таблицы. Для этого я написал заявление, которое занимает много времени для исполнения. Я даже не мог видеть результаты. Кроме того, это сломало мой phpmyadmin от localhost.

Вот код:

SELECT * FROM uniquestructures as uns WHERE uns.ProteinID IN (SELECT unp.* FROM uniqueproteins as unp HAVING LENGTH(unp.PDBASequence) < 20) as T)

Чтобы было понятно, сначала он выбирает записи со всеми столбцами, у которых длина последовательности меньше 20. Позже, в соответствии с идентификаторами выбранных записей, я ищу записи с тем же идентификатором (как ProteinID)

Большое спасибо за Вашу помощь

1 ответ

Решение

Я считаю, что вам нужно использовать 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;

Удачи!

Другие вопросы по тегам