У меня есть ряд значений в базе данных, которые мне нужно извлечь, чтобы создать линейную диаграмму. Поскольку мне не требуется высокое разрешение, я хотел бы пересчитать данные, выбирая каждую 5-ю строку из базы данных.
79
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [n] = 1
[n]
в запросе 5, чтобы получить каждую 5-ю строку.@row :=0
с@row :=2
= 1
к= 2
Вы можете попробовать мод 5, чтобы получить строки, в которых идентификатор кратен 5. (Предполагая, что у вас есть какой-то столбец идентификатора, который является последовательным.)
select * from table where table.id mod 5 = 0;
источник
Поскольку вы сказали, что используете MySQL, вы можете использовать пользовательские переменные для создания непрерывной нумерации строк. Однако вы должны поместить это в производную таблицу (подзапрос).
SET @x := 0; SELECT * FROM (SELECT (@x:=@x+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t WHERE x MOD 5 = 0;
Я добавил,
ORDER BY RAND()
чтобы получить псевдослучайную выборку, вместо того, чтобы позволять каждой пятой строке неупорядоченной таблицы быть в выборке каждый раз.Анонимный пользователь попытался изменить это, чтобы изменить
x MOD 5 = 0
наx MOD 5 = 1
. Я вернул его обратно к своему оригиналу.Для записи в этом состоянии можно использовать любое значение от 0 до 4, и нет причин предпочитать одно значение другому.
источник
SET @a = 0; SELECT * FROM t where (@a := @a + 1) % 2 = 0;
источник
Я искал что-то подобное. Ответ Тейлора и Билла побудил меня улучшить их идеи.
table data1 имеет поля read_date, значение, которое мы хотим выбрать каждую 2d запись из запроса, ограниченного диапазоном read_date, имя производной таблицы произвольно и здесь называется DT
запрос:
SET @row := 0; SELECT * FROM ( SELECT @row := @row +1 AS rownum, read_date, value FROM data1 WHERE read_date>= 1279771200 AND read_date <= 1281844740 ) as DT WHERE MOD(rownum,2)=0
источник
SET @row := 0; SELECT count(distinct Message) FROM ( SELECT @row := @row +1 AS rownum, Message FROM operations.EventLog WHERE LogTime > now() - interval 6 hour and ProcedureName = 'Do_CDR' ) as DT WHERE MOD(rownum,2)=0;
Вы можете использовать этот запрос,
set @n=2; <!-- nth row --> select * from (SELECT t.*, @rowid := @rowid + 1 AS ID FROM TABLE t, (SELECT @rowid := 0) dummy) A where A.ID mod @n = 0;
или вы можете заменить n своим n-м значением
источник
SELECT * FROM ( SELECT @row := @row +1 AS rownum, posts.* FROM ( SELECT @row :=0) r, posts ) ranked WHERE rownum %3 = 1
где посты - моя таблица.
источник
Если вы используете MariaDB 10.2, MySQL 8 или новее, вы можете сделать это более эффективно, и я думаю более ясно, используя общие табличные выражения и оконные функции .
WITH ordering AS ( SELECT ROW_NUMBER() OVER (ORDER BY name) AS n, example.* FROM example ORDER BY name ) SELECT * FROM ordering WHERE MOD(n, 5) = 0;
По сути, это создает временную таблицу с содержимым
example
таблицы, упорядоченным поname
полю, добавляет дополнительное поле, называемоеn
номером строки, а затем выбирает только те строки с номерами, которые точно делятся на 5, то есть каждую 5-ю строку. На практике движок базы данных часто может оптимизировать это лучше, чем это. Но даже если он не оптимизирует его дальше, я думаю, это понятнее, чем итеративное использование пользовательских переменных, как это было в более ранних версиях MySQL.источник
Если вам не требуется номер строки в наборе результатов, вы можете упростить запрос.
SELECT [column name] FROM (SELECT @row:=0) temp, [table name] WHERE (@row:=@row + 1) % [n] = 1
Замените следующие заполнители:
[column name]
списком столбцов, которые вам нужно получить.[table name]
именем своей таблицы.[n]
цифрой. например, если вам нужна каждая 5-я строка, замените ее на 5источник