mysql程序/功能

时间:2016-10-25 07:47:31

标签: mysql optimization

我正在尝试开发一个需要高级数据库查询的投票应用程序。该应用程序允许用户使用他们的电话号码投票给其他用户。因此,请确保拥有多个电话号码的用户将所有选票统计在一起,我有一张表格,使用国家身份证号码将他们的电话号码关联起来。最后我有两个表格如下:

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 ;

2 个答案:

答案 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新手通常滥用的另一个功能,这通常表示“我的查询错误,但由于某种原因,这似乎解决了它”。不要随意,不小心或经常使用它,不要在没有特定理由的情况下使用它。这里的理由显而易见。