Как вы выбираете каждую n-ю строку из mysql?
У меня есть ряд значений в базе данных, которые мне нужно вытащить, чтобы создать линейный график. Поскольку мне не требуется высокое разрешение, я хотел бы пересчитать данные, выбрав каждую 5-ю строку в базе данных.
6 ответов
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [n] = 1
Вы можете попробовать мод 5, чтобы получить строки, где ID кратен 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 в этом состоянии, и нет никаких причин предпочитать одно значение другому.
Если вы используете 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.
Я искал что-то вроде этого. Ответ Тейлора и Билла привел меня к совершенствованию их идей.
таблица data1 имеет поля read_date, значение, которое мы хотим выбрать для каждой двухмерной записи в запросе, ограниченном диапазоном 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
Если вам не требуется номер строки в наборе результатов, вы можете упростить запрос.
SELECT
[column name]
FROM
(SELECT @row:=0) temp,
[table name]
WHERE (@row:=@row + 1) % [n] = 1
Замените следующие заполнители:
- Заменить
[column name]
со списком столбцов, которые вам нужно получить. - Заменить
[table name]
с названием вашей таблицы. - Заменить
[n]
с номером. например, если вам нужна каждая 5-я строка, замените ее на 5
$Query = "SELECT *
FROM (
SELECT @row := @row +1 AS rownum, posts.*
FROM (
SELECT @row :=0) r, posts
) ranked
WHERE rownum %3 =1";
где сообщения моя таблица:
Вы можете использовать этот запрос,
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-м значением