【问题标题】:how to get records of a table whose id's are taken from a select statement如何获取其 id 取自 select 语句的表的记录
【发布时间】:2011-12-06 00:52:12
【问题描述】:

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

非常感谢您的帮助

【问题讨论】:

  • 首先 - 您可能想阅读 JOIN 语法。其次,在 uniquestructures 和 uniqueproteins 中有多少行?另外 - 尝试将 unp.* 替换为(猜测)unp.ProteinID
  • 啊。刚抽了。 uns.ProteinId 是否可与 uniqueproteins 表中所有列的串联相媲美?
  • 我也使用了 LEFT JOIN。 Uniquestructures 和 uniqueproteins 具有相同的大小和相同的 ID 信息——20370 行。但是序列长度小于 20 的行是 2228。所以,我需要选择 2228 中的每个 id 并返回具有该 id 的唯一结构中的行。

标签: mysql having nested-statement


【解决方案1】:

我认为您需要在这里使用INNER JOINDISTINCT

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)。如果数据不是静态的,则创建一个触发器以在每次将行插入或更新到uniqueproteins 表时填充PDBASequenceLength 列。因此:

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;

祝你好运!

【讨论】:

  • 非常感谢,它成功了。我检查了我的代码并添加了不同的内容,甚至可以为左连接工作。但我想知道,为什么我发布的代码不起作用?只是为了学习:)你能解释一下吗?
  • 没问题!问题出在您的子选择中,即 ...(select unp.*... 这需要更改为 ...(select unp.ProteinId.... 我建议使用内部连接,因为这通常更好方法比嵌套子选择。
  • PS 如果它有效,那么您可能希望通过接受答案来表明这一点:)
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多