как получить записи таблицы, чьи идентификаторы взяты из оператора select - PullRequest
0 голосов
/ 12 октября 2011

У меня есть две таблицы. Я пытаюсь выбрать несколько записей из одной из них. Затем часть идентификатора этого выбора должна использоваться для выбора некоторых записей другой таблицы. Для этого я написал заявление, которое требует много времени для исполнения. Я даже не мог видеть результаты. Кроме того, это сломало мой 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 Ответ

0 голосов
/ 12 октября 2011

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

Удачи!

...