2009-03-12 4 views
2

Если у меня есть таблица с гипотетическими столбцами foo и bar. бар может иметь в себе 50-60 различных значений. Моя цель здесь - выбрать, скажем, до 5 строк за 6 уникальных баров. Так что, если у 6 уникальных баров, которые выбраны из 50-60 каждый, есть как минимум 5 строк данных, у нас будет всего 30 строк.Запрос на вопрос MySQL

+0

Какие бруски вы хотите? Любые 6 неуклюжих баров? –

+0

Любые 6 уникальных баров. До N строк максимум для каждого бара. Если в одном баре есть только 3 связанных строки, тогда он должен просто захватить все 3. – Coocoo4Cocoa

ответ

-1

Получается ли это вызов из какой-либо программы?

Если это возможно, вы можете просто найти строки и случайно отправить их в оператор select.

Таким образом, ваш выбор может быть просто: выберите * из таблицы, где находится строка в (?,?), И вы можете перенести проблему случайности в код, который, откровенно говоря, лучше справляется с этим.

0

Я думаю, что самый простой способ - использовать СОЮЗ.

SELECT * FROM table WHERE bar = 'a' LIMIT 5 UNION SELECT * FROM table WHERE bar='b' UNION SEL ....... you get the jist, i hope 

EDIT: не уверен, если это то, что вам нужно - вы не говорите, нужен ли этот запрос также каким-то образом определить бары? или если они пройдены?

1

Ее было время, так как я работал с MySQL (я работаю с MSSQL в последнее время), но две вещи приходят на ум:

  • Своего рода автообъединение
  • Cursor

автообъединение может выглядеть как

SELECT DISTINCT bar FROM table AS t1 LIMIT 5 
    JOIN table AS t2 ON t1.foo = t2.foo 

Опять же, его б een a while, так что это может быть недействительным MySQL. Кроме того, вы получите все Foo's back для 5 баров, так что вам придется выяснить, как обрезать это.

2

Что вы действительно хотите сделать это:

SELECT * 
FROM `sometable` 
WHERE `bar` IN (
    SELECT DISTINCT `bar` 
    FROM `sometable` 
    ORDER BY RAND() 
    LIMIT 6 
) 

К сожалению, вы, вероятно, получите это:

ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 

Возможно, ваша версия будет более тесного сотрудничества. В противном случае вам, вероятно, понадобится сделать это как два запроса.

+0

Я собирался рекомендовать то же самое решение, просто не настолько уверенное в жизнеспособности подзапросов. – David

+0

Этот запрос может возвращать более 5 строк на уникальный бар, так что это не то, что он ищет. –

0

простое решение, которое занимает 7 запросов:

SELECT distinct bar FROM sometable ORDER BY rand() LIMIT 6 

Затем для каждого из значений 6 бар выше, сделать это, заменив {$ бар} для значения, конечно:

SELECT foo,bar FROM sometable WHERE bar='{$bar}' ORDER BY rand() LIMIT 5 

Будьте осторожны с использованием «ORDER BY rand()», поскольку это может привести к тому, что MySQL выберет много строк из вашей таблицы и вычислит функцию rand() для всех из них, а затем отсортирует их. Это может занять много времени, если у вас большой стол.

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

Для второго запроса, вы можете разделить его на два этапа:

SELECT count(*) FROM sometable WHERE bar='{$bar}' 

Затем в вашем программном коде, вы знаете, сколько элементов там, так что вы можете произвольно выбирать, какие из них, чтобы посмотреть на , и использовать OFFSET и LIMIT:

SELECT foo,bar FROM sometable WHERE bar='{$bar}' LIMIT 1 OFFSET {$offset} 
Смежные вопросы