Проблема с LIMIT & 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 subquery"
Кто-нибудь знает какой-либо другой способ сделать это?
Спасибо
Ответы
Ответ 1
Вот как вам нужно действовать. См. Пример, который я разработал.
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)
Надеюсь, что это поможет.
Ответ 2
Вам не нужно использовать подзапрос для извлечения всех записей, просто исключите первый:
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 является числовым
Ответ 3
Вы также можете дважды вложить внутренний запрос, чтобы обойти это ограничение, см.
Операция удаления Mysql с ограничением
Ответ 4
Это ограничение - боль, если вы хотите получить что-то вроде "верхних N строк для каждой группы". Но в вашем случае я бы не использовал эту функцию, даже если это было возможно. То, что вы пытаетесь сделать, - подсчитать все строки, кроме одной строки, каждый CxID
. Все, что вам нужно, это просто вычесть количество различных идентификаторов CustomerID, которое count(DISTINCT cp.CxID)
. Поэтому ваш окончательный запрос должен быть таким простым, как:
SELECT count(cp.CxID) - count(DISTINCT cp.CxID) as intSmokers
FROM CustPrimarySmoking cp