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

Can I use a subquery to complete a where clause?

我有 2 个 table 由 membership.ID 和 memberDues.memberID 连接。成员资格 table 有一列 firstLast,它对于每一行都是唯一的。如果我有 firstLast 的值,我应该能够找到 membership.ID 并将其与 memberDues.memberID 进行比较。我正在使用以下查询,但它不起作用:

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

结果得到了正确的 memberDues.memberID 和它行中的其他数据,但从成员 table 中提取了一个不相关的数据集,甚至 ID 都是错误的。查询有什么问题?

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

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

您可以根据共享的 ID 值连接两个表,然后您可以 select 仅那些具有 firstLast = 'Jim Smith' 的行。我认为您可以使用以下查询更有效地实现您想要的(避免一个额外的 select):

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;

What's wrong with the query?

您的查询联接了 2 个表,但未指定关联它们的条件。

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

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