1

这似乎很有趣。

假设三个表 ,usersitems一个连接表users_items。后者将users.ids 链接到items.ids。当表中有一行包含对 ( , )时,我们说用户U拥有项目。Iusers_itemsU.idI.id

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

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

  1. 收集所有项目id
  2. 收集id用户拥有的物品U
  3. id从 #1 中生成的集合中删除步骤 #2中的所有s
  4. 从结果集中选择随机元素(微不足道)

这是唯一理智的方法吗?是最优的吗?让我们假设这将是一个被大量使用的功能。而且每个表中的元素数量巨大。

有什么有趣的想法、想法吗?

4

2 回答 2

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;

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

于 2012-05-23T23:07:16.527 回答
0

为什么不随机化 sql 以便在一个查询中完成。我不确定您使用的是 mysql、tsql 还是其他东西,但这个问题提到了使用ORDER BY RAND() LIMIT 1. 像这样的东西怎么样:

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
于 2012-05-23T23:07:18.237 回答