Проблема с подзапросом LIMIT & IN / ALL / ANY / SOME - PullRequest
12 голосов
/ 15 февраля 2011

У меня есть этот запрос:

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» *

Кто-нибудь знает какой-либо другой способ сделать это?

Спасибо

Ответы [ 4 ]

32 голосов
/ 15 февраля 2011

Вот как вам нужно действовать. Смотрите пример, который я разработал.

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 голос
/ 15 февраля 2011

Вам не нужно использовать подзапрос для извлечения всех записей, просто исключите первую:

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 голосов
/ 09 ноября 2017

Это ограничение является болезненным, если вы хотите получить что-то вроде «верхних N строк для каждой группы». Но в вашем случае я бы не использовал эту функцию, даже если бы это было возможно. То, что вы пытаетесь сделать, это подсчитать все строки, кроме одной строки CxID. Все, что вам нужно, это просто вычесть количество различных идентификаторов клиентов, которое составляет count(DISTINCT cp.CxID). Таким образом, ваш последний запрос должен быть таким простым:

SELECT count(cp.CxID) - count(DISTINCT cp.CxID) as intSmokers 
FROM CustPrimarySmoking cp
0 голосов
/ 12 февраля 2016

Вы также можете дважды вложить внутренний запрос, чтобы обойти это ограничение, см .:

Оператор удаления Mysql с ограничением

...