我有两张桌子。我尝试从其中一个中选择一些记录。然后,ID的部分选择应该用于选择另一个表的一些记录。为此,我写了一份声明,需要很长时间才能执行。我甚至看不到结果。 此外,这破坏了我的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的记录。之后,根据所选记录的ID,我搜索记录具有相同的ID(作为ProteinID)
非常感谢您的帮助
答案 0 :(得分: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;
祝你好运!