选择是否所有行ID都存在于具有列检查的其他表中

时间:2014-05-30 22:06:26

标签: mysql sql

我有两个表格sitescallback_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相互匹配以防止作弊。

4 个答案:

答案 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