2009-12-14 3 views
1

OK У меня есть столбец на моей таблице с именем style_number. Могут быть дубликаты style_number. Я хочу выбрать все, но только до 3 для каждого номера стиля.MySql: установить лимит для повторяющегося столбца

Так, например, если есть 4 строки, которые имеют style_number = "style 7", будут выбраны только 3 из этих 4 (не имеет значения, какие 3, любые 3).

Имеет ли это смысл?

Как я могу это сделать?

Спасибо!

Примечание: Я использую 4.1.22

EDIT: Чтобы удалить некоторую путаницу. Мне нужны все остальные столбцы, и мне нужно больше, чем просто «стиль 7», или я мог бы легко ограничить 3, но, например, если это где моя таблица:

style_number | цена | stone_count

"style 7" | 300 | 2 
"style 7" | 400 | 3 
"style 7" | 500 | 4 
"style 7" | 600 | 5 
"style 8" | 200| 1 
"style 8" | 300 | 2 

Я хотел бы получить это в результате:

"style 7" | 300 | 2 
"style 7" | 400 | 3 
"style 7" | 500 | 4 
"style 8" | 200| 1 
"style 8" | 300 | 2 

ли это сделать лучше понять?

+1

Вы можете показать нам свой запрос в его нынешнем виде? я бы хотел увидеть предложение where, если оно есть. – 2009-12-14 16:57:06

+0

Вас интересует только значение style_number или соответствующие столбцы в таблице с этими критериями? –

ответ

1

Я не разработчик MySQL, но я думаю, что это даст вам то, что вы хотите. Никаких обещаний по исполнению не было :)

SELECT 
    T1.id, 
    T1.style_number, 
    T1.col1, 
    T1.col2, 
    ... 
FROM 
    My_Table T1 
WHERE 
    (
      SELECT 
       COUNT(*) 
      FROM 
       My_Table T2 
      WHERE 
       T2.style_number = T1.style_number AND 
       T2.id < T1.id 
    ) < 3 
+0

Я думаю, что это самое близкое к тому, что мне нужно. К сожалению, я получаю эту ошибку: # 1235 - Эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery». Я не думаю, что могу использовать LIMIT в подзапросе. –

+0

Я только что отредактировал его и поместил другое решение, которое, мы надеемся, будет работать в MySQL (работает в SQL Server, и я думаю, что это ANSI-совместимый). Опять же, не может делать никаких обещаний о производительности. –

+0

Отлично! Я не совсем понимаю логику, но она работает! –

0
SELECT * FROM yourTable WHERE style_number = "style 7" LIMIT 3 

Это ограничит набор результатов максимум тремя рядами, в зависимости от того, что обнаружит первый движок базы данных. Если вы хотите получить верхнюю часть 3 по некоторому атрибуту, вы можете добавить ORDER BY colName до LIMIT 3.

+0

Но это будет ТОЛЬКО вернуть стиль 7, я хочу все разные стили, но только максимум 3 для каждого. –

+0

О, я вижу. Я не понял этого вопроса. Извините, если я неправильно понял. –

0

Предложение TOP позволяет указать количество возвращаемых строк.

Например: SELECT TOP 3 * из таблицы, где style_number = "стиль 7"

http://www.w3schools.com/sql/sql_top.asp

+1

В mysql нет «ТОП-3». Используйте 'LIMIT' вместо него –

0

Из-за вашей версии MySQL ваши варианты могут быть весьма ограниченными; это может быть невозможно сделать в одном запросе, поэтому я решил, что дам альтернативу.

Простым решением было бы перебрать каждый стиль и запросить этот стиль с помощью параметра LIMIT 3, но вам нужно будет выполнить много запросов. Для того, чтобы объединить их в один запрос, сначала нужно получить список всех стилей:

SELECT DISTINCT style_number FROM styles; 

Затем вы можете итерацию по style_numbers построить строку SQL в языке программирования, так что она выглядит следующим образом:

SELECT * FROM styles WHERE style_number = 'style 7' LIMIT 3 
UNION 
SELECT * FROM styles WHERE style_number = 'style 8' LIMIT 3 
UNION 
... 

Надеюсь, это поможет.

Смежные вопросы