0

2つのテーブルがあります。そのうちの1つからいくつかのレコードを選択しようとしています。次に、その選択のIDの部分を使用して、他のテーブルのいくつかのレコードを選択する必要があります。そのために、実行に時間がかかるステートメントを書きました。結果も見えませんでした。また、それはローカルホストから私のphpmyadminを壊しました。

コードは次のとおりです。

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

明確にするために、最初にシーケンス長が20未満のすべての列を持つレコードを選択します。その後、選択したレコードのIDに従って、(ProteinIDと)同じIDを持つレコードを検索しています。

ご助力ありがとうございます

4

1 に答える 1

0

私はあなたがここでを使用する必要があると思い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;

幸運を!

于 2011-10-12T11:45:55.767 に答える