У мене є ряд значень у базі даних, які мені потрібно зробити, щоб створити лінійну діаграму. Оскільки мені не потрібна висока роздільна здатність, я хотів би зробити вибірку даних, вибравши кожен 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;
Я шукав щось подібне. Відповідь Тейлора та Білла змусила мене вдосконалити свої ідеї.
таблиця 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