mysql过程/函数

mysql过程/函数,mysql,optimization,Mysql,Optimization,我正在尝试开发一个需要高级数据库查询的投票应用程序。该应用程序允许用户使用其电话号码投票给其他用户。所以,要确保一个有很多电话号码的用户将他们的投票统计在一起,我有一个表格,将他们的电话号码与他们的国家ID号码关联起来。最后,我有两张表: 用户\国家\ id表 用户电话号码国家id --------------------|-------------------- 电话1 | nat_id1 电话2 | nat_id1 投票表 用户电话号码发送者 --------------------|---

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

用户\国家\ id表

用户电话号码国家id
--------------------|--------------------
电话1 | nat_id1
电话2 | nat_id1

投票表

用户电话号码发送者
--------------------|--------------------
电话1 |发送者1
电话1 |发送者2
电话2 |发送者3
电话2 |发送者2

我现在需要一种方法,它在user_national_ID表中收集唯一的国家ID号,将国家ID与user_national_ID表中的用户电话号码相关联,然后计算返回的电话号码出现在投票表中的次数

提前谢谢

(从评论移到…)


嗯,如果我理解得很好,应该是:

select count(sender) from votes inner join user_national on (votes.user_phone_no = user_national.user_phone_no) where national_id = {yourValueHere}

嗯,如果我理解得很好,应该是:

select count(sender) from votes inner join user_national on (votes.user_phone_no = user_national.user_phone_no) where national_id = {yourValueHere}

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,它给出了用户的所有电话号码,从那里,我们根据u1中的标准计算与我们在u2中找到的电话号码匹配的所有电话号码的选票(通过计算发件人)。我们统计
不同的
发送者,这会丢弃重复的投票,因为当前的结构似乎允许我投票给用户的不同电话号码,但我认为应该忽略这些号码。如果没有,请删除
不同的


DISTINCT
是SQL新手通常滥用的另一个功能,这通常是“我的查询出错了,但由于某种原因,这似乎可以解决问题”的标志。不要随意、粗心或例行公事地使用它,也不要在没有特定理由的情况下使用它。在这里,理由似乎显而易见。

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,它给出了用户的所有电话号码,从那里,我们根据u1中的标准计算与我们在u2中找到的电话号码匹配的所有电话号码的选票(通过计算发件人)。我们统计
不同的
发送者,这会丢弃重复的投票,因为当前的结构似乎允许我投票给用户的不同电话号码,但我认为应该忽略这些号码。如果没有,请删除
不同的


DISTINCT
是SQL新手通常滥用的另一个功能,这通常是“我的查询出错了,但由于某种原因,这似乎可以解决问题”的标志。不要随意、粗心或例行公事地使用它,也不要在没有特定理由的情况下使用它。这里,理由似乎很明显。

@mmushtaq我不擅长Sql,但我尝试了连接,但显然不起作用。这就是我想到的问题。问题是它会返回两个结果,其中两个表是
国家id
?(查询中缺少限定条件。)@mmushtaq我不擅长Sql,但我尝试了连接,但显然不起作用。这就是我想到的问题。问题是它会返回两个结果,其中两个表是
national\u id
?(查询中缺少限定条件。)当您已经知道国家ID号时,这确实有效。我的问题是通过结果获取不同的国家ID循环,并像您所做的那样计数。因此,将动态提供国家ID。当您已经知道国家ID号时,这确实有效。我的问题是通过结果获取不同的国家ID循环,并像您所做的那样计数。这样就可以动态地提供国家ID了。太棒了!工作起来像个迷人的东西!很有魅力