2011-02-15 46 views
12

我有這個疑問:問題的限制和IN/ALL/ANY/SOME子查詢

SELECT count(cp.CxID) as intSmokers 
FROM CustPrimarySmoking cp 
JOIN Customer c ON cp.CxID = c.CustomerID 
WHERE 
cp.CxID IN (SELECT CxID FROM CustPrimarySmoking WHERE CxID = cp.CxID LIMIT 1, 9999) 

的想法是,計數將基於嵌套查詢的結果,其檢索所有記錄客戶除第一條記錄外。

不過,我得到這個錯誤,我認爲這是相當終端:

1235 - 該版本的MySQL還不支持 'LIMIT & IN/ALL/ANY/SOME子查詢'

有沒有人知道這樣做的任何其他方式?

感謝

+1

我親愛的...`SELECT COUNT(cp.CxID)作爲intSmokers FROM CustPrimarySmoking CP JOIN客戶C對cp.CxID = c.CustomerID WHERE cp.CxID IN(SELECT CxID FROM CustPrimarySmoking WHERE CxID = cp.CxID)LIMIT 1,9999999` – ajreal 2011-02-15 13:21:48

+1

重寫您的查詢MySQL不支持子查詢中的LIMIT。請參閱http://dev.mysql.com/doc/refman/5.0/en/subquery-restrictions.html – Nishant 2011-02-15 13:21:51

+0

AjReal,這將無法正常工作;你試圖限制1的整數查詢,它只檢索一個結果(計數)。 – TheBounder 2011-02-15 13:25:29

回答

32

這是你需要如何繼續。看看我已經制定的例子。

mysql> select * from test; 
+------+-------+ 
| id | name | 
+------+-------+ 
| 1 | name1 | 
| 2 | name2 | 
| 3 | name3 | 
| 4 | name4 | 
+------+-------+ 
4 rows in set (0.00 sec) 

mysql> select * from test1; 
+------+------+--------+ 
| id | tid | name2 | 
+------+------+--------+ 
| 1 | 2 | name11 | 
| 2 | 3 | name12 | 
| 3 | 4 | name13 | 
+------+------+--------+ 
3 rows in set (0.00 sec) 

mysql> select 
    -> t1.name 
    -> from 
    -> test t1 
    -> join 
    -> test1 t2 on t2.tid = t1.id 
    -> join 
    -> (select id from test where id <4 limit 3) as tempt on tempt.id = t1.id; 
+-------+ 
| name | 
+-------+ 
| name2 | 
| name3 | 
+-------+ 
2 rows in set (0.00 sec) 

希望這會有所幫助。

1

你不需要使用子查詢檢索所有的記錄,只排除第一種:

SELECT count(cp.CxID) as intSmokers FROM CustPrimarySmoking cp JOIN Customer c ON cp.CxID = c.CustomerID WHERE cp.CxID > (SELECT cxID FROM CustPrimarySmoking ORDER BY cxID LIMIT 1)

假設cxid是數字

0

這種限制是一個痛苦,如果你想要得到的東西,如「前N行的每一組」 。但在你的情況下,即使可能,我也不會使用該功能。你試圖做的是統計除了每行之外的所有行,CxID。您所需要的僅僅是減去不同CustomerID的數量,即count(DISTINCT cp.CxID)。因此,最終的查詢應該是簡單的:

SELECT count(cp.CxID) - count(DISTINCT cp.CxID) as intSmokers 
FROM CustPrimarySmoking cp