我有两个表,sites
和callback_votes
,其中站点保存可供投票的站点,而callback_votes
保存每个站点上已进行的投票。
callback_votes的结构如下:
(来源:gyazo.com)
每次有人投票时,回调函数都会将一个新的callback_votes
行及其投票的站点ID添加到site_id中,并将用户名,投票的IP地址添加到该行中。
现在,我想做的是,检查用户是否在表站点中的所有站点上都通过给定ip遍历所有callback_votes
行进行投票,并检查它是否与site_id
表中的sites
相匹配。
这是我尝试做的事情:
SELECT sites.*
FROM sites
WHERE (
SELECT COUNT(*)
FROM callback_votes
WHERE callback_votes.ip = '127.0.0.1') = (
SELECT COUNT(*)
FROM sites);
但是此查询无法满足我的要求,它仅检查该ip是否具有与sites表中的行数相同的投票数,这是可作弊的。
如何按照我的描述去做?
编辑;
我的网站提供要投票的站点,每个站点在站点表中都有其自己的ID。要对站点进行投票,用户单击站点(我使用站点表加载所有站点按钮),然后将其发送到站点页面。用户投票后,他投票过的站点将向我的站点发送回叫,我的站点将在callback_votes中创建一个新行,其中包含他投票过的站点ID,他的ip和用户名。
现在,我想通过检查callback_votes中的投票数是否相同以及site_id彼此匹配以防止作弊来检查用户是否对所有可用站点进行了投票。
最佳答案
获取不在ip中是用户ip的回调中的站点数中没有不同的站点数:
Select count(*) From sites
Where site_id NOT IN (Select DISTINCT site_id From callback_votes Where ip='1.0.0.127')
这将返回尚未被该IP投票的站点数。如果count为0,则用户已投票全部。
关于mysql - 通过列检查选择其他表中是否存在所有行ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23964041/