随机选择尚未在连接表中的实体

时间:2012-05-23 22:59:08

标签: database performance optimization

这看起来很有趣。

假设有三个表,usersitems和一个联接表users_items。后者将users.id链接到items.id。当U表格中有一行包含该对(Iusers_items)时,我们说用户U.id拥有商品I.id

现在:如何随机选择特定用户尚未拥有的项目?

最可行的解决方案似乎是:

  1. 收集所有项目id s。
  2. 收集用户id拥有的U项。
  3. 从#1
  4. 中生成的集合中删除步骤#2中的所有id
  5. 从结果集中挑选随机元素(平凡)
  6. 这是唯一理智的方式吗?它是最佳的吗?让我们假设这将是一个使用频繁的功能。每张表中的元素数量都很大。

    有趣的想法,想法?

2 个答案:

答案 0 :(得分:2)

您可以使用左连接来生成用户目前不拥有的项ID的列表:

SELECT i.id
FROM items i 
LEFT JOIN users_items ui ON ( i.id = ui.item_id AND ui.users_id = 2 )
WHERE ui.item_id IS NULL;

从这里,您可以随机选择结果集中的一个元素。

答案 1 :(得分:0)

为什么不随机化sql,以便在一个查询中完成。我不确定你是否使用mysql,tsql或其他东西,但使用ORDER BY RAND() LIMIT 1提到了this question。这样的事情怎么样:

select i.itemName
from users as s
left join items as i
    on i.id not in 
        (select ui.itemID from users_items as ui where ui.userID = u.id)
order by rand()
limit 1