SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.03.2012 22:18:09

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Ограничить результат по данным колонки

Добрый вечер.

Подскажите, пожалуйста, есть ли в MySQL возможность ограничить результат по данным к-л колонки, поясню на примере:


show create table table1;
+--------+----------------------------
| Table  | Create Table
+--------+----------------------------
| table1 | CREATE TABLE `table1` (
  `id1` int(11) NOT NULL,
  `id2` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+----------------------------
select * from table1;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 | 212 |
|   1 |  12 |
|   1 | 534 |
|   2 |  45 |
|   2 |   6 |
|   3 | 232 |
|   3 | 556 |
|   3 |  56 |
|   3 |  89 |
+-----+-----+

Необходимо выбрать данные из обеих колонок, но ограничить их по id1: не более двух одинаковых id1, то есть в результате должна быть выборка:

+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 | 212 |
|   1 |  12 |
|   2 |  45 |
|   2 |   6 |
|   3 | 232 |
|   3 | 556 |
+-----+-----+

Записей с id1=1 и id1=3 более двух, поэтому "срезались" лишние и выбрались только первые две максимум. Я пытался играться с HAVING COUNT, но как-то это совсем не про то.

Отредактированно FiMko (24.03.2012 22:22:58)

Неактивен

 

#2 24.03.2012 22:25:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Ограничить результат по данным колонки

Прочтите вот этот топик до САМОГО конца. Или вот эту статью осильте.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 24.03.2012 22:28:00

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Ограничить результат по данным колонки

deadka написал:

Прочтите вот этот топик до САМОГО конца. Или вот эту статью осильте.

deadka, спасибо! Направление понял, ушел читать...

Отредактированно FiMko (24.03.2012 22:28:11)

Неактивен

 

#4 24.03.2012 23:14:42

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Ограничить результат по данным колонки

Наваял что-то вроде:

SET @maximum = 2, @cnt = 0, @dummyid = 0;
SELECT id1, id2, @cnt := IF(@dummyid = id1, @cnt + 1, 1), @dummyid := id1 AS dummyid
FROM table1
WHERE @cnt < @maximum OR @dummyid <> id1

Отредактированно FiMko (24.03.2012 23:19:17)

Неактивен

 

#5 25.03.2012 00:50:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Ограничить результат по данным колонки

Похоже на правду, только замените
FROM table1
на FROM (select * from table1 order by id1) t


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 25.03.2012 10:17:34

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Ограничить результат по данным колонки

deadka написал:

Похоже на правду, только замените
FROM table1
на FROM (select * from table1 order by id1) t

Спасибо, не учел. Однако это в корне ломает весь замысел: идея была ограничить выборку, взяв лишь по две записи для каждого id1. Что же получается теперь: выбираем все данные таблицы(!) и лишь потом срезаем лишнее. Экономим только на трафике.

---
Полезная ссылка: How to number rows in MySQL

Отредактированно FiMko (25.03.2012 13:20:21)

Неактивен

 

#7 25.03.2012 11:55:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Ограничить результат по данным колонки

Внутри MySQL эта операция будет на порядок быстрее, чем в PHP.

Неактивен

 

#8 25.03.2012 13:45:02

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Ограничить результат по данным колонки

rgbeast написал:

Внутри MySQL эта операция будет на порядок быстрее, чем в PHP.

Ок, спасибо, тогда оставляю как конечный вариант.

Неактивен

 

#9 25.03.2012 13:45:43

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Ограничить результат по данным колонки

FiMko написал:

deadka написал:

Похоже на правду, только замените
FROM table1
на FROM (select * from table1 order by id1) t

Спасибо, не учел. Однако это в корне ломает весь замысел: идея была ограничить выборку, взяв лишь по две записи для каждого id1. Что же получается теперь: выбираем все данные таблицы(!) и лишь потом срезаем лишнее. Экономим только на трафике.

Можно и по-другому - либо сделать накрывающий индекс на поля id1 и id2, либо, если тип таблицы MyISAM и Вы точно знаете, что id1 только возрастает, то можно и не сортировать дополнительно. В приведенной статье на webew.ru об это подробней сказано.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson