如何摆脱这个双mysql连接中的重复?

时间:2014-12-11 19:48:57

标签: php mysql

我查看了其他Q& A&s,我没有看到我的情景。

我的副本很奇怪。不同的登录管理器将获得不同数量的重复项,具体取决于其下的用户数量。

SELECT user_groups.*, user_table.*, my_quotes.* 
FROM user_groups 
RIGHT JOIN user_table 
ON user_table.usergroup = user_groups.groupid 
RIGHT JOIN my_quotes 
ON my_quotes.groupid = user_groups.groupid

需要显示my_quotes的结果,同时还要显示其他表格中的其他信息。

报价属于用户,也属于经理。当经理为用户创建报价时,但恰好有管理者管理的其他用户,上述查询中的报价表将显示每个用户的报价,即使报价仅属于一个用户。

所以说经理下有2个用户。用户1有引号,用户2有引号。引号mysql表只有2条记录,因此html表应该只显示2条记录,而是显示4条记录。报价1为2,报价2为2。

现在让我们说经理下面添加了另一个用户。然后,html表将为每个引号显示3条记录。这很奇怪。

以下不起作用:

SELECT DISTINCT user_groups.*, user_table.*, my_quotes.* 
FROM user_groups 
RIGHT JOIN user_table 
ON user_table.usergroup = user_groups.groupid 
RIGHT JOIN my_quotes 
ON my_quotes.groupid = user_groups.groupid

user_groups:

groupid, name, userid

USER_TABLE:

userid, username, email, usergroup, name, company, address, phone, manager, client

my_quotes:

id, userid, groupid, clientname, ponumber, date, postage, qty, price, total, approved

有几个表有太多字段要发布。我只是把相关问题放在这个问题上。

给出的答案之一有所帮助,但仍有问题。如您所见,根据登录用户是admin,manager还是client,有3种不同的查询。管理员和客户端显示正确的记录,管理员几乎显示,但管理员缺少记录。

if($_SESSION['usergroup']==1) {

    $tableresult = mysql_query('

        SELECT user_groups.*, user_table.*, my_quotes.* 
        FROM user_groups 
        RIGHT JOIN user_table 
        ON user_table.usergroup = user_groups.groupid 
        RIGHT JOIN my_quotes 
        ON my_quotes.userid = user_table.userid

    ') or die(mysql_error());

} else if($manager==1) {

    $tableresult = mysql_query('

        SELECT user_groups.*, user_table.*, my_quotes.* 
        FROM user_groups 
        RIGHT JOIN user_table 
        ON user_table.usergroup = user_groups.groupid 
        RIGHT JOIN my_quotes 
        ON my_quotes.userid = user_table.userid 
        WHERE user_groups.userid='.$_SESSION['userid'].'

    ') or die(mysql_error());

} else {

    $tableresult = mysql_query('

        SELECT my_quotes.*, user_table.* 
        FROM my_quotes 
        INNER JOIN user_table 
        ON my_quotes.userid = user_table.userid 
        WHERE user_table.userid = '.$_SESSION['userid'].' 
        AND (approved = 1 OR approved = 2)

    ') or die(mysql_error());

}

2 个答案:

答案 0 :(得分:2)

根据您的示例,引号与用户的ID相关,那么您应该join按用户的ID而不是该组。

SELECT user_groups.*, user_table.*, my_quotes.* 
FROM user_groups 
RIGHT JOIN user_table 
ON user_table.usergroup = user_groups.groupid 
RIGHT JOIN my_quotes 
ON my_quotes.userid = user_table.userid

管理员的新答案:(管理员可以看到所有引号)

SELECT user_table.*, my_quotes.* 
FROM user_table
RIGHT JOIN my_quotes 
ON my_quotes.userid = user_table.userid //this will grab all the quotes

答案 1 :(得分:1)

SELECT DISTINCT user_groups.*, user_table.*, my_quotes.* 
FROM user_groups 
RIGHT JOIN user_table 
ON user_table.usergroup = user_groups.groupid 
RIGHT JOIN my_quotes 
ON my_quotes.groupid = user_groups.groupid

使用不同或更好的编码。