我有两个表,sites
和 callback_votes
,其中 sites 包含可供投票的可用站点,而 callback_votes
包含已投票的选票在每个网站上完成。
callback_votes 的结构如下:
(来源:gyazo.com)
每次有人投票时,回调都会添加一个新的 callback_votes
行,其中包含他投票的站点 id 到 site_id 以及他投票的用户名和 ip 地址。
现在我想做的是,通过 all callback_votes
行检查用户是否对表站点中的所有站点进行了投票对于给定的 ip,并检查它是否与 sites
表中的 site_id
匹配。
这是我尝试做的事情:
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的回调中获取不在distinct number of sites中的站点数:
Select count(*) From sites
Where site_id NOT IN (Select DISTINCT site_id From callback_votes Where ip='1.0.0.127')
这将返回尚未被该 ip 投票的站点数。如果计数为 0,则用户已全部投票。
关于mysql - 使用列检查选择其他表中是否存在所有行 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964041/