0

我有两张桌子。我尝试从其中之一中选择一些记录。然后,该选择的 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,我正在搜索具有相同ID的记录(如ProteinID)

非常感谢您的帮助

4

1 回答 1

0

我认为您需要在这里使用INNER JOINwith a 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 回答