Считать из таблицы, но перестать считать на определенное число - PullRequest
6 голосов
/ 19 ноября 2009

Есть ли в MySQL путь к COUNT(*) из таблицы, где, если число больше x, он там перестанет считать? По сути, я хочу знать только, является ли количество записей, возвращаемых запросом, больше или меньше определенного числа. Если оно больше этого числа, мне все равно, сколько строк, если оно меньше, подскажите мне количество.

Я смог выдумать это так:

-- let x be 100

SELECT COUNT(*) FROM (
    SELECT `id` FROM `myTable`
    WHERE myCriteria = 1
    LIMIT 100
) AS temp

... но мне было интересно, есть ли какой-нибудь удобный встроенный способ сделать это?


Спасибо за предложения, но я должен был быть более ясным о причинах этого вопроса. Он выбирает из пары объединенных таблиц, каждая из которых содержит десятки миллионов записей. Выполнение COUNT(*) с использованием индексированных критериев все еще занимает около 80 секунд, а выполнение без индекса занимает около 30 минут или около того. Это больше касается оптимизации запроса, а не получения правильного результата.

Ответы [ 3 ]

7 голосов
/ 19 ноября 2009
SELECT * FROM WhateverTable WHERE WhateverCriteria
LIMIT 100, 1

LIMIT 100, 1 возвращает 101-ю запись, если она есть, или нет записи в противном случае. Вы можете использовать вышеуказанный запрос в качестве подзапроса в предложениях EXIST, если это поможет.

1 голос
/ 19 ноября 2009

Я не могу думать ни о чем. Мне кажется, что то, что вы делаете, в точности соответствует цели, и SQL, безусловно, не делает все возможное, чтобы вам было проще сделать это более кратко.

Обратите внимание: то, что вы пытаетесь сделать, не имеет смысла в строгом контексте арифметики множеств. Математически, ответ состоит в том, чтобы посчитать все, а затем взять MIN() со 100, чего вы (прагматично и по уважительной причине) пытаетесь избежать.

0 голосов
/ 19 ноября 2009

Это работает:

select count(*) from ( select * from  stockinfo s limit 100 ) s

но не был быстрее (что я мог сказать) из просто:

select count(*) from stockinfo

, который возвратил 5170965.

...