MySQL упорядочен случайным образом, но отображаются первые 5 результатов? - PullRequest
0 голосов
/ 16 февраля 2012

Хорошо, у меня есть 3 таблицы MySQL

Категория Компании Предложения

Я хочу, чтобы кто-то щелкнул страницу категории, на которой ему показываются предложения от каждой компании в случайном порядке, чтобы никто не получил предпочтения. Компания может иметь от 1 до 10 предложений, и может быть любое количество предложений, связанных с категорией.

Это все работает нормально, но я хочу, чтобы 5 лучших (или более, что бы ни было проще) предложений от уникальных компаний. Остальные внизу могут быть в любом порядке, если они не повторяют те, которые уже показаны в топ-5.

Не уверен, что лучший способ это сделать, так как это немного выходит за рамки моих возможностей - будет ли это сделать 2 запроса и оставить их присоединенными, исключая идентификаторы предложений из первого запроса во втором?

Любая помощь высоко ценится!

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Должен быть более эффективный способ сделать это, но мой мозг сегодня не на 100%.Как насчет -

SELECT
    company_offers.companyid,
    offers.offerid,
    offers.title,
    offers.offer
FROM (
    SELECT
        companies.companyid,
        (
            SELECT offers.offerid
            FROM offers
            WHERE offers.companyid = companies.companyid
            AND categoryid = '%s'
            AND active = 1
            ORDER BY RAND()
            LIMIT 1
        ) AS offerid
    FROM companies
    WHERE EXISTS (SELECT NULL FROM offers WHERE offers.companyid = companies.companyid AND offers.categoryid = '%s' AND offers.active = 1)
    ORDER BY RAND()
    LIMIT 5
) AS company_offers
INNER JOIN offers
    ON company_offers.offerid = offers.offerid

ОБНОВЛЕНИЕ: Добавлен EXISTS для внутренних компаний SELECT

, а затем исключить эти 5 offer_ids из основного оператора SELECT.

SELECT companies.companyid, offers.offerid, offers.title, offers.offer
FROM offers
INNER JOIN companies
    ON companies.companyid = offers.companyid
WHERE offers.categoryid = '%s'
AND offers.active = 1
AND offers.offerid NOT IN (comma separated list of 5 from previous query)
ORDER BY RAND()
1 голос
/ 16 февраля 2012

Не проверено, но что-то подобное должно работать.Можем ли мы увидеть ваш текущий запрос?

SELECT DISTINCT company, and, other, columns 
FROM table
ORDER BY RAND()
LIMIT 5
0 голосов
/ 17 февраля 2012

Я использовал то, что предлагал nnichols, но настроил (по какой-то причине для первоначального запроса мне потребовалось 3,5 секунды), поэтому я использовал это:

SELECT * 
FROM (SELECT offers.companyid, offerid, title, offer 
      FROM companies 
      INNER JOIN offers ON offers.companyid = companies.companyid 
      WHERE offers.categoryid='%s' AND offers.active = '1' 
      ORDER BY RAND()) AS t 
GROUP BY t.companyid 
ORDER BY RAND() 
LIMIT 10

Что требует только 1004 * для запуска. Затем я сохранил используемый идентификатор предложения и использовал NOT IN от nnichols для второго запроса, теперь он прекрасно работает

Еще раз спасибо за помощь каждому:)

...