我正在尝试开发一个需要高级数据库查询的投票应用程序。该应用程序允许用户使用他们的电话号码投票给其他用户。因此,请确保拥有多个电话号码的用户将所有选票统计在一起,我有一张表格,使用国家身份证号码将他们的电话号码关联起来。最后我有两个表格如下:
user_national_id表
user_phone_no | national_id
-------------------- | -----------------
PHONE1 | nat_id1
PHONE2 | nat_id1
投票表
user_phone_no |发件人
-------------------- | -----------------
PHONE1 | sender1
PHONE1 | sender2
PHONE2 | sender3
PHONE2 | sender2
我现在需要一种方法,在user_national_id表中收集唯一的国民身份证号码,将国民身份证与user_national_id表中的用户电话号码相关联,然后计算返回的电话号码在投票表中出现的次数。
提前致谢。
(从评论中移出......)
DELIMITER $$
CREATE PROCEDURE GetUniqueNominees()
BEGIN DECLARE done BOOLEAN;
DECLARE nomIds VARCHAR(255);
DECLARE curIds CURSOR FOR
SELECT DISTINCT national_id
FROM user_national_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
OPEN curIds;
LOOPROWS: LOOP
IF done=TRUE THEN
CLOSE curIds;
LEAVE LOOPROWS;
END IF;
FETCH curIds
INTO nomIds;
SELECT DISTINCT nomIds;
select count(user_phone_no)
from votes
inner join user_national_id
ON (votes.user_phone_no = user_national_id.user_phone_no)
where national_id=nomIds;
END LOOP;
END$$
DELIMITER ;
答案 0 :(得分:0)
select count(sender) from votes inner join user_national on (votes.user_phone_no = user_national.user_phone_no) where national_id = {yourValueHere}
答案 1 :(得分:0)
SQL通常不需要循环和游标,并且通常(但并非总是),当您认为需要它们时,您不需要。
SQL不是程序性的,它应该是声明性的:你告诉服务器你想要什么 - 而不是服务器应该如何获得它。然后,服务器(查询优化器)可以自由地实现它可以想到的任何逻辑来计算结果,只要它在逻辑上与您所要求的一致。
在这种情况下,这是表达你似乎要问的方式:
SELECT u1.national_id, COUNT(DISTINCT v.sender) AS votes_counted
FROM user_national_id u1
JOIN user_national_id u2 ON u2.national_id = u1.national_id
JOIN votes v ON v.user_phone_no = u2.user_phone_no
WHERE u1.user_phone_no = ?
GROUP BY u1.national_id
这里,我们使用user_national_id表的两个“虚拟副本”,别名为u1和u2。我们在u1中找到输入的电话号码,其中给出的是用户的国家ID。从那里,我们在u2中找到了相同的国家ID,它为我们提供了用户电话号码的所有,从那里,我们计算与电话匹配的所有电话号码的投票(通过计算发件人)我们在u2中找到的数字,基于u1的标准。我们计算DISTINCT
发件人,它会丢弃重复的投票,因为当前的结构似乎允许我投票给用户的不同电话号码,但我认为这些被忽略了。如果没有,请删除DISTINCT
。
DISTINCT
是SQL新手通常滥用的另一个功能,这通常表示“我的查询错误,但由于某种原因,这似乎解决了它”。不要随意,不小心或经常使用它,不要在没有特定理由的情况下使用它。这里的理由显而易见。