У меня есть ряд значений в базе данных, которые мне нужно извлечь, чтобы создать линейную диаграмму. Поскольку мне не требуется высокое разрешение, я хотел бы пересчитать данные, выбирая каждую 5-ю строку из базы данных.
У меня есть ряд значений в базе данных, которые мне нужно извлечь, чтобы создать линейную диаграмму. Поскольку мне не требуется высокое разрешение, я хотел бы пересчитать данные, выбирая каждую 5-ю строку из базы данных.
Ответы:
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-м значением
Если вы используете 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