2015-11-03 127 views
-1

我有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

回答

1

你可以加入兩個表上的共享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

太棒了!我很高興我幫助你。 –

0

您應該使用IN而不是等號:

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

這有什麼錯查詢:我覺得你可以更有效地你想要實現使用下面的查詢(避免一個額外的選擇)?

您的查詢加入2個表格,但未指定與它們相關的條件。

爲了快速開始您的問題,我試圖在where子句中指定 membership.ID = memberDues.memberID

我的個人建議是在ON子句中使用該條件使用LEFT JOIN。但它是更高級的SQL編碼,選擇取決於這個特定應用程序的結構和需求。