Как вернуть только 10 строк с помощью SQL-запроса

#mysql #sql

#mysql #sql

Вопрос:

У меня есть 1 запрос, который возвращает более 180 тыс. строк. Мне нужно внести небольшое изменение, чтобы оно возвращало только примерно на 10 меньше.

Как мне показать только 10 строк в результате?

Я пробовал EXCEPT , но, похоже, возвращает намного больше, чем просто 10.

Комментарии:

1. Показать разницу между двумя запросами , где они??

2. Можете ли вы предоставить нам свой запрос?

3. Я хочу знать разницу между 2 машинами. Ну и какие из них?

Ответ №1:

Вы можете использовать LIMIT. Это покажет первые n строк. Пример:

 SELECT * FROM Orders LIMIT 10
  

Если вы пытаетесь сделать разбивку на страницы, добавьте СМЕЩЕНИЕ. Он вернет 10 строк, начиная со строки 20. Пример:

 SELECT * FROM Orders LIMIT 10 OFFSET 20
  

Ответ №2:

MySQL не поддерживает EXCEPT (насколько мне известно).

Вероятно, наиболее эффективным способом было бы объединить два WHERE предложения в одно. Я говорю эффективно в смысле «Делайте это таким образом, если вы собираетесь запускать этот запрос в обычном отчете или производственном приложении».

Например:

 -- Query 1
SELECT * FROM table WHERE `someDate`>'2016-01-01'
-- Query 2
SELECT * FROM table WHERE `someDate`>'2016-01-10'
-- Becomes
SELECT * FROM table WHERE `someDate` BETWEEN '2016-01-01' AND '2016-01-10'
  

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

В этом случае вы можете злоупотреблять UNION и вложенным запросом:

(Непроверенный, обрабатывается как псевдо-SQL …)

 SELECT
   *
FROM (
   SELECT * FROM table WHERE `someDate`>'2016-01-01'
   UNION ALL
   SELECT * FROM table WHERE `someDate`>'2016-01-10'
) AS sub
GROUP BY
   `primaryKey`
HAVING
   COUNT(1) = 1;
  

Хотя это некрасиво. И неэффективно.

Предполагая, что единственная разница заключается только в том, что на одной стороне (я буду называть это «правой стороной») отсутствуют записи, которые содержит левая сторона, вы могли бы LEFT JOIN выполнить два запроса (как вспомогательные) и отфильтровать значение right-side-is-null. Но это будет зависеть от того, верны ли все эти оговорки.

Временные таблицы могут быть вашим другом — особенно учитывая, что они так легко создаются (и могут быть проиндексированы):

 CREATE TEMPORARY TABLE tmp_xyz AS SELECT ... FROM ... WHERE ...;