Могу ли я использовать один запрос MySQL для выбора отдельных строк, а затем отдельных строк, если предел не был достигнут?

Надеюсь, я правильно объясняю, мои знания MySQL весьма ограничены.

Допустим, у меня есть таблица со строками, в которых есть поле с именем shape.

Я хочу выбрать несколько строк из таблицы, но сначала вернуть все строки с уникальными значениями полей shape. Если у меня меньше определенного количества строк, скажем, 7, то я хотел бы заполнить оставшиеся строки результатов строками неуникальной формы. Лучше всего я могу сказать, что они «упорядочены по уникальности, а затем по какому-то другому значению».

Итак, я не хочу: квадрат, квадрат, круг, круг, прямоугольник, квадрат, треугольник

Я хотел бы иметь: квадрат, круг, прямоугольник, треугольник, квадрат, квадрат, круг

Возможно ли это сделать с помощью одного SQL-запроса? Я использую MySQL с PHP, если это имеет значение.

Спасибо!


person Matt Rix    schedule 01.06.2010    source источник
comment
Является ли поле имени уникальным? Если нет, то есть ли у вас ПК на столе?   -  person hgulyan    schedule 01.06.2010
comment
Я только что отредактировал вопрос, чтобы удалить ссылку на поле имени, так как я все равно никогда не использовал его в примере, хороший улов :) В реальной таблице у меня был бы pk и все такое, но я просто хотел перейти к суть вопроса и убрать все остальное.   -  person Matt Rix    schedule 01.06.2010


Ответы (3)


Сначала вы можете выбрать ограниченное количество строк из комбинации различных значений в объединении с вашим неуникальным запросом (который вы также ограничиваете максимальным количеством строк, которые вы хотите получить).

т.е. выберите field1, field2,... from (выберите отдельное field1, field2,... from... UNION выберите field1, field2,... from... LIMIT MAX_ROW_COUNT) AS total LIMIT MAX_ROW_COUNT

person wimvds    schedule 01.06.2010

Возможно, вы сможете сделать это с помощью UNION (т.е. использовать два разных запроса, но просто объединить результаты)

person Mitch Dempsey    schedule 01.06.2010

Вы можете использовать UNION ALL для объединения двух разных (но одинаковых) запросов. Но я не думаю, что LIMIT работает с UNION, тогда вам придется:

SELECT уникальный запрос здесь, с ограничением 0,7 UNION ALL SELECT другой запрос здесь, с ограничением 0,7

Хотя они оба имеют одинаковые значения SELECT, они объединяются в 1 результат, тогда вы можете просто отрезать все строки после 7.

А может уже можно сделать LIMIT на весь UNION, вот этого я не знаю.

person Rik De Peuter    schedule 01.06.2010