【发布时间】:2015-06-04 18:11:30
【问题描述】:
我有 3 个表 sc_user、sc_cube、sc_cube_sent
我想加入一个用户查询(sc_user)一个不同的随机消息/多维数据集(来自 sc_cube),它之前没有发送给那个用户(sc_cube_sent),所以结果集中的每一行都有一个不同的用户 ID以及来自 sc_cube 的随机立方体 ID,它不是 sc_cube_sent 的一部分,并且与该用户 ID 相关联。
我面临的问题是我似乎无法在内部 On 子句中需要外部查询的 u.id 的情况下使用关联 ID。我需要注释部分才能使其正常工作。
# get one random idcube per user not already sent to that user
SELECT u.id, sub.idcube
FROM sc_user as u
LEFT JOIN (
SELECT c.idcube, sent.idreceiver FROM sc_cube c
LEFT JOIN sc_cube_sent sent ON ( c.idcube = sent.idcube /* AND sent.idreceiver = u.id <-- "unknown column u.id in on clause" */ )
WHERE sent.idcube IS NULL
ORDER BY RAND()
LIMIT 1
) as sub
ON 1
我添加了一些数据:http://sqlfiddle.com/#!9/7b0bc/1 应该为用户 1 显示的新立方体 (sc_cube) 如下:2150、2151、2152、2153
编辑>>
我可以用另一个子查询而不是连接来做到这一点,但这会对性能产生巨大影响并且是不可行的(每个表上几千行的 30 秒+,并具有合理实现的键),所以我仍在寻找一个使用 JOIN 解决方案的方法。
SELECT
u.id,
(SELECT sc_cube.idcube
FROM sc_cube
WHERE NOT EXISTS(
SELECT sc_cube.idcube FROM sc_cube_sent WHERE sc_cube_sent.idcube = sc_cube.idcube AND sc_cube_sent.idreceiver = u.id
)
ORDER BY RAND() LIMIT 0,1
) as idcube
FROM sc_user u
【问题讨论】:
-
你能添加一些数据或 sql fiddle 吗?您还指定 idcube 为空的位置,因此您的 on 子句不能基于 idcube
-
您想要 user1 的所有这些结果吗?我以为你是按 rand 订购并限制 1
-
每个用户元组没有一个随机 id
-
哦,好的,明白了...所以您的初始查询有问题...没有返回的 idreceivers...sqlfiddle.com/#!9/8d1df/5
-
感谢 John,但我不需要 idreceiver,您正在检查 2 个已知 id,我希望 idcube 与结果集中的每个用户行相关。