MySQL按随机顺序排列,但显示不同的前5个结果


MySQL order by random but show distinct first 5 results?

好的,我有3个MySQL表

类别公司提供

我希望有人点击"类别"页面,按照随机顺序向他们显示每家公司的报价,这样就不会有人优先考虑。一家公司可以有1到10个优惠,并且可以有任何数量的优惠链接到一个类别。

这一切都很好,但我希望前五名(或更多,最简单的)报价都来自独特的公司。下面的其他人可以按照任何顺序排列,只要他们不重复那些已经进入前五名的人。

我不确定最好的方法,因为这有点超出了我的能力——是不是做两个查询,然后加入它们,在第二个查询中排除第一个查询中的offer id?

非常感谢您的帮助!

必须有更有效的方法来做到这一点,但我的大脑今天还没有达到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

然后从SELECT主语句中排除这5个offer_id。

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()

未测试,但类似的东西应该可以工作。我们可以查看您当前的查询吗?

SELECT DISTINCT company, and, other, columns 
FROM table
ORDER BY RAND()
LIMIT 5

我使用了nnicholls的建议,但进行了调整(由于某种原因,最初的查询需要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

只需要0.0088即可运行。然后我存储了正在使用的offer id,并使用nnicholls中的NOT IN进行第二次查询,现在工作得很好

再次感谢大家的帮助:)