Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用2个表的Select语句返回400万REOCRD,而不是500万REOCRD_Sql_Mysql - Fatal编程技术网

Sql 使用2个表的Select语句返回400万REOCRD,而不是500万REOCRD

Sql 使用2个表的Select语句返回400万REOCRD,而不是500万REOCRD,sql,mysql,Sql,Mysql,我创建了一个小型映射表,将值与另一个表中的值相关联。当我执行选择时,我得到了400万REOCRD~ 我知道这一定是我在做的小事。如果有人能A)告诉我我做错了什么,B)告诉我应该阅读哪些文献,以便我理解这些问题,我将不胜感激:)(网站、书籍等) 很抱歉,我得到了额外的数据,我假设它是以某种形式重复的。查询试图做的是获取用户id和产品id。我试图用来自另一个表的类别id替换产品id 数据库结构如下所示 位置映射(表) id(int) catid(内部) prodid(varchar25)) 用户

我创建了一个小型映射表,将值与另一个表中的值相关联。当我执行选择时,我得到了400万REOCRD~

我知道这一定是我在做的小事。如果有人能A)告诉我我做错了什么,B)告诉我应该阅读哪些文献,以便我理解这些问题,我将不胜感激:)(网站、书籍等)

很抱歉,我得到了额外的数据,我假设它是以某种形式重复的。查询试图做的是获取用户id和产品id。我试图用来自另一个表的类别id替换产品id

数据库结构如下所示

位置映射(表)
  • id(int)
  • catid(内部)
  • prodid(varchar25))
用户映射(表)
  • id(int)
  • prodid(varchar)
  • uid(varchar)
以前的情况是从usermap中选择prodid,uid


但现在我想让prodid等于catid。我使用locmapping创建这些映射(理论上:)

SQL在语义上是正确的。如果返回的记录比预期的多,很可能是因为需要在WHERE子句中添加第二对列,以进一步限制两个表之间记录的“匹配”方式,或者将其中一个表中的记录限制为子集(可能是找到的当前或最近的记录)

如果没有对问题的更完整描述、您的表结构以及理想情况下的一些示例数据,就不可能进一步猜测出问题所在。

转到SQL学校:

如果不知道每个表中有多少行,就很难知道您是否做错了什么。i、 e.如果表A中有400万条记录,而且它们也都在表B中(根据您加入的字段),那么您将获得400万条记录


而且,这只是一个SQL问题,与网站无关。

没有数据模型,很难判断问题出在哪里。也许你误解了内部连接的工作原理


您的查询正在使用内部联接。这意味着必须有400万个十字路口。Usersmap可能有500000行,但如果其中一行的prodid包含在locmapping的多行中,则您将为每个交叉点获得一行。

从这些表结构中,类别和产品之间以及用户和产品之间似乎存在多对多关系

如果是这样的话,一个用户可以通过许多产品映射到一个类别,这就是为什么会有这么多额外的行-在这种情况下,答案就是简单地将DISTINCT添加到查询中,如下所示:

select DISTINCT u.uid, l.catid 
from usersmap u, locmapping l where u.prodid=l.prodid

如果选择prodid,usermap中的uid将生成500K行,但问题中的SQL将生成400万行,这意味着prodid的每个值(平均)在表locmapping的8行中找到。这将导致原始500K行乘以8,这些行将返回各种catid值


如果locmapping旨在为每个prodid提供一个catid,则应使用唯一索引保护该表中的prodid列。

如果不需要整个数据集,则限制会有所帮助。另外,一个数据库方案也会有很大的帮助。请你能包括usersmap和locmapping的结构吗?看起来他们好像是在错误的领域加入。(如果您能告诉我们prodid的用途,这也可能是一个很大的帮助。)我猜还有第二个catid字段需要连接(或者第三个表包含此字段)。但是,如果没有模式,谁知道呢!行数怎么样?如果列出每个表的行计数,以及每个表的select distinct(prodid)的结果记录计数,那么我们可能会告诉您出了什么问题。
select DISTINCT u.uid, l.catid 
from usersmap u, locmapping l where u.prodid=l.prodid