#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 ...;