如何获取其id来自select语句的表的记录

时间:2011-10-12 10:49:17

标签: mysql having nested-statement

我有两张桌子。我尝试从其中一个中选择一些记录。然后,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)

非常感谢您的帮助

1 个答案:

答案 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;
祝你好运!