Php 显示9个结果的mysql查询

Php 显示9个结果的mysql查询,php,mysql,mysql5,Php,Mysql,Mysql5,我有个问题 我正在运行以下查询。我的数据库中只有一条记录,但我得到了9条结果 SELECT c.id, c.rk FROM cv AS c, employee AS e , cvCat AS cv_cat WHERE c.status=1 AND c.empIDFK = e.id AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) AND cv_cat.cvFK = c.id 如果有人对这个问题

我有个问题

我正在运行以下查询。我的数据库中只有一条记录,但我得到了9条结果

SELECT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id
如果有人对这个问题有任何疑问,请告诉我。为什么我得到9个结果而不是1个结果

此查询应仅显示一条记录,但它将显示9个结果。

SELECT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id
FROM cv AS c, employee AS e , cvCat AS cv_cat
您正在对三个表进行隐式联接。如果要获得不同的记录,可以在选择后添加不同的记录:

SELECT DISTINCT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id
当你这样做的时候

FROM cv AS c, employee AS e , cvCat AS cv_cat
您正在对三个表进行隐式联接。如果要获得不同的记录,可以在选择后添加不同的记录:

SELECT DISTINCT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id
使用显式联接:

SELECT c.id, c.rk
FROM cv c
INNER JOIN employee e ON e.id = c.empIDFK
INNER JOIN cvCat cv_cat ON cv_cat.cvFK = c.id
WHERE c.status = 1
AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46)
使用显式联接:

SELECT c.id, c.rk
FROM cv c
INNER JOIN employee e ON e.id = c.empIDFK
INNER JOIN cvCat cv_cat ON cv_cat.cvFK = c.id
WHERE c.status = 1
AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46)

我认为9结果行问题是基于您的连接语法,因为这种隐式连接将返回每个表的所有行作为连接结果,因为您只提取c.id和c.rk,看起来MySQL将相同的结果发送了9次

旁注:不推荐使用隐式连接,使用显式连接,例如

    SELECT c.id, c.rk
    FROM cv c
    LEFT JOIN employee e ON c.empIDFK = e.id
    LEFT JOIN cvCat cv_cat ON c.id = cv_cat.cvFK
    WHERE...

这将有助于进一步验证您的代码,并为整个查询添加更多的自描述语法。

我认为9结果行问题基于您的联接语法,因为这种隐式联接将返回每个表的所有行作为联接结果,由于您只提取c.id和c.rk,看起来MySQL将相同的结果发送了9次

旁注:不推荐使用隐式连接,使用显式连接,例如

    SELECT c.id, c.rk
    FROM cv c
    LEFT JOIN employee e ON c.empIDFK = e.id
    LEFT JOIN cvCat cv_cat ON c.id = cv_cat.cvFK
    WHERE...

将有助于将来验证您的代码,并在整个查询中添加更多的自描述语法。

为什么您不能像普通人那样编写联接查询?为什么您不能像普通人那样编写联接查询?它不应该让您的查询花费比现在更多的时间。如果您选择的不同列被索引,那么mySQL将能够使用该索引返回不同的记录。如果列没有索引,那么mySQL将创建一个临时表来计算不同的记录。如果使用EXPLAIN作为查询的前缀,则可以检查标记为EXTRAIN的最后一列,它将告诉您是使用索引还是临时表来返回不同的结果。我正在索引id。这是我的主键。很好,如果是这样,您就可以了。试试看,你会发现:它不应该让你的查询花费比现在更多的时间。如果您选择的不同列被索引,那么mySQL将能够使用该索引返回不同的记录。如果列没有索引,那么mySQL将创建一个临时表来计算不同的记录。如果使用EXPLAIN作为查询的前缀,则可以检查标记为EXTRAIN的最后一列,它将告诉您是使用索引还是临时表来返回不同的结果。我正在索引id。这是我的主键。很好,如果是这样,您就可以了。试试看,你会发现:左连接和内连接有什么不同。左连接和内连接有什么不同。@Lalajee如果是这样的话,你需要按照zi42的建议,在选择后添加关键字DISTINCT。如果之前的结果是9行完全相同的数据,那么添加DISTINCT将只输出一行。在不知道表中的数据或确切输出的情况下,可以提供的建议数量是有限的。至于速度,使用显式连接实际上应该比任何事情都快。@Lalajee如果是这样的话,你需要遵循zi42的建议,在SELECT之后添加DISTINCT关键字。如果之前的结果是9行完全相同的数据,那么添加DISTINCT将只输出一行。在不知道表中的数据或确切输出的情况下,可以提供的建议数量是有限的。至于速度,使用显式连接实际上应该比任何东西都更快。