2011-02-15 14 views
12

tengo esta consulta:Problema con LÍMITE Y EN/ALL/ANY/SOME subconsulta

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) 

La idea es que el recuento se basa en los resultados de la consulta anidada que recupera todos los registros de ese cliente EXCEPTO el primer registro.

Sin embargo, me sale este error, que creo que es bastante Terminal:

1235 - Esta versión de MySQL todavía no soporta 'LÍMITE EN &/ALL/ANY/SOME subconsulta'

¿Alguien sabe de alguna otra manera de hacer esto?

Gracias

+1

querida ... 'SELECT count (cp.CxID) como intSmokers DE CustPrimarySmoking cp SE UNEN EN cliente C = cp.CxID c.CustomerID DONDE cp.CxID IN (SELECCIONE CxID FROM CustPrimarySmoking WHERE CxID = cp.CxID) LIMIT 1, 9999999' – ajreal

+1

reescriba su consulta MySQL no admite 'LIMIT' en la subconsulta. Consulte http://dev.mysql.com/doc/refman/5.0/en/subquery-restrictions.html – Nishant

+0

AjReal, eso no funcionará; está intentando limitar con un desplazamiento de 1 la consulta completa que solo recupera un resultado (el recuento). – TheBounder

Respuesta

32

esto es cómo debes proceder Mira el ejemplo que he resuelto.

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) 

Espero que esto ayude.

+12

wow, creo que te amo. – srchulo

+0

Me encanta esta solución. Mejorado por consulta de 240s a 0.03s. ¿Pero cómo es que esa subconsulta no da el error "no soporta la subconsulta LIMIT"? –

+0

Excelente, ¡esto resuelve mi problema y mejora la velocidad de la consulta! – Dax

1

que no es necesario utilizar la subconsulta para recuperar todos los registros, simplemente excluir la primera de ellas:

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)

Suponiendo que cxid es numérico

+0

Eso simplemente ignora el primero; no es el primero para cada cliente – TheBounder

+0

Luego, agregue la unión de los clientes a la subconsulta también: 'WHERE cp.CxID = (SELECCIONAR cps.cxID FROM CustPrimarySmoking AS cps UNIRSE al cliente cust ON cps.CxID = cust.CustomerID ORDER BY cps.cxID LIMIT 1)' – Nikoloff

+0

Eso va seleccionar solo el primer registro para cada cliente; Quiero ignorar el primer registro y seleccionar los siguientes. – TheBounder

0

Esta limitación es un dolor si quieres conseguir algo como "top N filas para cada grupo" . Pero en su caso yo no usaría esa función incluso si fuera posible. Lo que intenta hacer es contar todas las filas, excepto una fila cada CxID. Todo lo que necesita es solo restar el número de CustomerIDs distintos, que es count(DISTINCT cp.CxID). Por lo que su consulta final debe ser tan simple como:

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