我可以使用子查询来完成where子句吗?

问题描述:

我有2个表由membership.ID和memberDues.memberID连接。成员资格表有一列firstLast,对每一行都是唯一的。如果我有firstLast的值,那么我应该能够找到membership.ID并将其与memberDues.memberID进行比较。我使用下面的查询,但它不工作:我可以使用子查询来完成where子句吗?

SELECT * FROM memberDues, membership 
WHERE memberID = 
(SELECT ID FROM membership 
WHERE firstLast = 'Jim Smith') 
ORDER BY payDate DESC 
LIMIT 1 

结果得到正确memberDues.memberID并从其行其他数据,但拉不相关的数据从会员表,其中甚至ID设置错误。查询有什么问题?

+2

你正在做一个笛卡儿积...交叉连接... m行和n行在resultset中产生m * n行。然后你说,嘿,只要给我从排列的所有 – Drew

+0

1行,选择*与联接倾向于提供一些不受欢迎的列。很好的快速查询,但干净的生产 – Drew

你可以加入两个表上的共享ID值,然后你可以只选择具有firstLast = 'Jim Smith'那些行。

SELECT aa.*, bb.* 
FROM memberDues AS aa 
INNER JOIN membership AS bb 
ON aa.memberID = bb.ID 
WHERE bb.firstLast = 'Jim Smith' 
ORDER BY aa.payDate DESC 
LIMIT 1; 
+0

谢谢科斯塔斯,这是一个优雅的解决方案,是有道理的。它也有效! – parboy

+0

太棒了!我很高兴我帮助你。 –

您应该使用IN而不是等号:

SELECT * FROM memberDues, membership WHERE memberID IN 
    (SELECT ID FROM membership WHERE firstLast = 'Jim Smith') 
    ORDER BY payDate DESC LIMIT 1 

这有什么错查询:我觉得你可以更有效地你想要实现使用下面的查询(避免一个额外的选择)?

您的查询加入2个表格,但未指定与它们相关的条件。

为了快速开始您的问题,我试图在where子句中指定 membership.ID = memberDues.memberID

我的个人建议是在ON子句中使用该条件使用LEFT JOIN。但它是更高级的SQL编码,选择取决于这个特定应用程序的结构和需求。