我有两个表格sites
和callback_votes
,其中网站包含可投票的网站,callback_votes
保留已在每个网站上完成的投票。
callback_votes的结构如下:
img http://gyazo.com/7aa672895bc2fb76cdf54539558ec221.png
每次有人投票时,回调都会添加一个新的callback_votes
行,其中包含他投票的网站ID到site_id以及他投票的用户名,IP地址。
现在我要做的是,通过查看给定的 所有 callback_votes
行,检查用户是否已对表网站中的所有网站进行了投票ip,并检查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的投票数是否与站点表上的行数相同,这是可以作弊的。
我怎么能按照我描述的方式去做?
EDIT;
我的网站提供了投票的网站,每个网站在网站表中都有自己的ID。要在网站上投票,用户点击该网站(我使用网站表加载所有网站按钮),然后将其发送到网站的页面。一旦用户投票,他投票的网站就会向我的网站发送回调,我的网站将在callback_votes中创建一个新行,其中包含他投票的网站ID,他的IP和用户名。
现在我想通过检查callback_votes中的投票数是否相同来检查用户是否已对所有可用网站进行投票,并且site_id相互匹配以防止作弊。
答案 0 :(得分:2)
获取回调中不在不同网站数量的网站数量,其中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,则表示用户已全部投票。
答案 1 :(得分:1)
检查计数是否为0
select Count(*) from Sites
where Site_id NOT IN
(select Site_id from Votes where votes.user_ip = '127.0.0.1')
您可以使用
以相同的费用获取未投票的网站列表select Site_id from Sites
where Site_id NOT IN
(select Site_id from Votes where votes.user_ip = '127.0.0.1')
答案 2 :(得分:0)
SELECT IF(COUNT(DISTINCT(c.site_id)) = (SELECT COUNT(s.site_id) FROM sites s), 'true', 'false') as voted_all
FROM callback_votes c
WHERE c.ip='127.0.0.1';
如果他们在每个网站上投票,则返回true,否则返回false。
答案 3 :(得分:0)
SELECT IP, USERNAME, CASE COUNT(DISTINCT SITE_ID) WHEN (SELECT COUNT(DISTINCT ID) FROM SITES) THEN 'VOTED FOR ALL' ELSE 'OTHER' END
FROM callback_votes
GROUP BY IP, USERNAME