Вопрос MySQL - PullRequest
       14

Вопрос MySQL

2 голосов
/ 13 марта 2009

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

Ответы [ 5 ]

2 голосов
/ 13 марта 2009

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

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'

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

1 голос
/ 13 марта 2009

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

  • Какое-то самостоятельное соединение
  • A Курсор

Самостоятельное соединение может выглядеть примерно так:

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

Опять же, это было какое-то время, так что это может быть недопустимым MySQL. Кроме того, вы получите все спину для 5 баров, так что вам придется выяснить, как урезать это.

0 голосов
/ 15 марта 2009

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

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

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

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}
0 голосов
/ 13 марта 2009

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

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

РЕДАКТИРОВАТЬ: не уверен, что это то, что вам нужно - вы не говорите, нужно ли этому запросу также как-то определять бары? или если они переданы в?

0 голосов
/ 13 марта 2009

Это вызывается из какой-то программы?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...