我可以使用子查询来完成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设置错误。查询有什么问题?
你可以加入两个表上的共享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;
谢谢科斯塔斯,这是一个优雅的解决方案,是有道理的。它也有效! – parboy
太棒了!我很高兴我帮助你。 –
您应该使用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编码,选择取决于这个特定应用程序的结构和需求。
你正在做一个笛卡儿积...交叉连接... m行和n行在resultset中产生m * n行。然后你说,嘿,只要给我从排列的所有 – Drew
1行,选择*与联接倾向于提供一些不受欢迎的列。很好的快速查询,但干净的生产 – Drew