2015-01-03 3 views
0

У меня есть таблица MySQL, который выглядит следующийMySQL запросов установить LIMIT уникальных значений поля

--------------------------------------- 
|id  |setId |value1 |value2 | 
--------------------------------------- 
|1  |1  |value1 |value2 | 
|2  |2  |value1 |value2 | 
|3  |2  |value1 |value2 | 
|4  |3  |value1 |value2 | 
--------------------------------------- 

в основном Есть много записей (выше только в качестве примера) с уникальным IDs, но у многих есть такой же "setID".

Теперь, скажем, у меня есть следующий код:

SELECT * FROM table WHERE <rule> LIMIT 0,50 

<rule> не всегда то же самое, так что может Aswell игнорировать его здесь. Это вернет первые 50 записей.

В этом случае мне нужно вернуть первые строки n с до 50 уникальными идентификаторами setID.
Это означает, что если я посмотрю на приведенную выше таблицу с этим обычным «LIMIT», установленным на «2», он вернет первые 3 строки. Если LIMIT будет «3», он должен будет вернуть все 4 строки (поскольку id 2 и 3 используют один и тот же setID).

Если я использую GROUP BY setId, пользовательский LIMIT будет работать, но он не возвратит строку с id из 3 вообще, например.

Какая будет наилучшая возможная строка SQL для этого? Помощь очень ценится.

редактировать таблица не уже заказан setId, поэтому нет необходимости использовать какие-либо ORDER BY здесь.

edit2 как сказано в комментариях вероятно, лучший способ сделать это будет:
«Одна полная копия результатов присоединяется к второй копии результатов, который использует GROUP BY и JOIN, чтобы найти первые 50 setIDs. "

К сожалению, я не знаком с синтаксисом SQL, кто-нибудь знает хороший способ сделать это? Большое спасибо.

+0

не успевает написать и проверить все, но в основном вы получаете желаемые результаты (без LIMIT), а затем ПРИСОЕДИНИТЕСЬ с тем же набором результатов, сгруппированных по setID, ограничивая это значением до 50. Обратите внимание, что выбор ORDER BY является потенциально важным. – RobP

+0

Таблица уже заказана setId, так что все в порядке. Если I GROUP BY setId, некоторые строки не будут возвращены (например, value1 и value2 строки с id 3 не будут возвращены. – shiro

+0

Вы поняли, что я говорю о JOIN? Одна полная копия результатов объединена с второй экземпляр результатов, который использует GROUP BY и JOIN для поиска первых 50 идентификаторов set. – RobP

ответ

3

Этот запрос должен сделать трюк:

select * from table t, 
(select distinct tt.setId from table tt order by tt.setId limit 50) sets 
where t.setId = sets.setId 
order by t.Id 

В sets подзапроса мы находим все setId «S, что вам нужно (первые 50 уникальных из них), а затем в where статье мы говорим MySQL, что мы хотим получить только записи с этими setId.

редактировать Автор вопроса отметил, что таблица

уже заказан SETID, поэтому нет необходимости использовать какие-либо ORDER BY здесь

. Сами таблицы не сортируются, и если мы используем запрос без order by, заказ не гарантируется. Хотя, вполне вероятно, что фактический порядок будет порядком, в котором строки были добавлены, вы не можете полагаться на это. Только конструкция order by будет гарантировать порядок результирующего набора.

+0

Кажется правильным, но может быть синтаксическая ошибка. –

+0

отлично работает, спасибо! – shiro