2014-01-11 78 views
1
SELECT j. * , w. * 
    FROM tbljobseeker j 
    INNER JOIN tblworkexp w ON j.id = w.userid 
    WHERE (
    w.company_name LIKE '%xoriant%' 
    OR w.company_name LIKE '%XORIANT%' 
    OR w.company_name LIKE '%Xoriant%' 
    OR w.company_name LIKE '%Xoriant%') 
    AND (
    w.tomonth != 'till' 
    ) 
    AND (
    w.fromyear = ( 
    SELECT w.fromyear 
    FROM tblworkexp 
    WHERE w.tomonth != 'till' 
    ORDER BY w.fromyear DESC 
    LIMIT 1 , 10) 
    ) 
    ORDER BY STR_TO_DATE(j.lastModified, '%e-%M-%Y' ) DESC , id DESC 

請幫給予MySQL錯誤子查詢返回多個行

+0

MySQL的大部分實現不區分大小寫 – Strawberry

+0

你是說w.fromyear = [多個值] 而不是預期的w.fromyear = 2001;我現在確實爲你解答了問題。 – Rob

回答

0

變化是w.fromyear =w.fromyear in。這將解決問題。

爲了解釋,你的限制條款LIMIT 1 , 10說,讓我從第1條記錄開始記錄10條記錄。

=運算符,您只能檢查單個值而不能檢查多個值。要檢查多個值,你需要使用in運營商像in (val1,val2,val3, ..., valn)

所以,在文章發表的子查詢應該像

AND (
    w.fromyear in ( 
    SELECT w.fromyear 
    FROM tblworkexp 
    WHERE w.tomonth != 'till' 
    ORDER BY w.fromyear DESC 
    LIMIT 1 , 10) 
    ) 
0

你分配多個值,其中只有一個是預期。

這將工作,因爲它會檢查現在範圍:

SELECT j. * , w. * 
    FROM tbljobseeker j 
    INNER JOIN tblworkexp w ON j.id = w.userid 
    WHERE (
    w.company_name LIKE '%xoriant%' 
    OR w.company_name LIKE '%XORIANT%' 
    OR w.company_name LIKE '%Xoriant%' 
    OR w.company_name LIKE '%Xoriant%') 
    AND (
    w.tomonth != 'till' 
    ) 
    AND (
    w.fromyear in ( 
    SELECT w.fromyear 
    FROM tblworkexp 
    WHERE w.tomonth != 'till' 
    ORDER BY w.fromyear DESC 
    LIMIT 1 , 10) 
    ) 
    ORDER BY STR_TO_DATE(j.lastModified, '%e-%M-%Y' ) DESC , id DESC 
0

這個表達式:

w.fromyear = ( 
    SELECT w.fromyear 
    FROM tblworkexp 
    WHERE w.tomonth != 'till' 
    ORDER BY w.fromyear DESC 
    LIMIT 1 , 10) 
    ) 

不是做你的期望。它從1的偏移量中取出行。因此,它返回多於一行。也許你打算這一點,但也許你真正的意思是:

limit 10, 1 

,或者更明確寫道:

limit 1 offset 10 

更重要的是,此子查詢看起來不正確可言,因爲它從來沒有引用內表。所有的參考文獻是w,外表。事實上,它總是返回外層w.fromyear,所以比較永遠是真的。

我建議你寫另一個問題,帶有示例數據和期望的結果,以獲得有關SQL本身的幫助。