Как получить записи таблицы, чьи идентификаторы взяты из оператора 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;
Удачи!