Mysql 内部连接查询给出一行三次


Mysql inner join query gives a row three times

感谢您的阅读。

我正在尝试学习内部连接和加入。我的目的是比较是否创建社区的用户也在社区成员表中标记为管理员(我不确定 INNER JOIN 是否实现了这一点),并从社区表中获取与 CommunityID 相关的所有其他社区信息(据我所知,这是可以通过内部连接实现的)。

我有两个表,称为社区和社区成员。

该结构用于社区(它有其他数据,例如日期,内容等):

CommunityID -    Slug      - CreatedByUser
     1      -    video     -      2
     2      -    funny     -      2
     3      -    picture   -      4

对于社区成员

 CmID - UserID  -      Slug         - Power
   1  -   2     -      video        - admin
   2  -   2     -      funny        - admin
   3  -   4     -      picture      - admin

我的PHP代码:($_SESSION['UserID']是2)

<?php
$sql = $dbc->prepare(" SELECT cm.*, com.* 
                       FROM Community com
                       INNER JOIN CommunityMembers cm ON cm.UserID = com.CreatedByUser
                       WHERE cm.UserID = '" . $_SESSION['UserID'] . "'");
$sql->execute();
if($sql->rowCount()){
    echo  $sql->rowCount();
    while($data = $sql->fetch()){
        $output .= $data['Slug'] .'<br />';
    }
    echo $output;
}else{
    $_ERROR = "no record";
}
?>

echo $output;打印

video
video
video
funny
funny
funny

echo $sql->rowcount();打印 6

你能帮忙吗?为什么这个打印是3次相同的东西?我的解决方案是否正确检查社区是否是用户创建的,社区成员中标记为管理员,还是我需要检查它?

谢谢。

试试这个

$sql = $dbc->prepare(" 
SELECT cm.*, com.* 
FROM Community com
INNER JOIN CommunityMembers cm ON cm.UserID = com.CreatedByUser
WHERE cm.UserID = '" . $_SESSION['UserID'] . "'
GROUP BY com.CreatedByUser
");
$sql = $dbc->prepare(" SELECT DISTINCT cm.*, com.* 
                   FROM Community com
                   INNER JOIN CommunityMembers cm ON cm.UserID = com.CreatedByUser
                   WHERE cm.UserID = '" . $_SESSION['UserID'] . "'");

选择不同

http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html

如果您只需要知道它是否是管理员,请不要从社区成员中带来所有字段。试试这个

$sql = $dbc->prepare(" SELECT DISTINCT cm.Power, com.*
                       FROM Community com
                       LEFT JOIN CommunityMembers cm ON cm.UseriID=com.CreaterByUser
                       WHERE cm.UserID = '" . $_SESSION['UserID'] . "'");

没有测试它,但即使没有 DISTINCT,这也应该有效。

如果您选择 2 个表结果SELECT cm.*, com.*它将返回所有不同的对,因此请尝试仅选择您需要的特定字段。

PS :完整的结果是什么,我的意思不仅是现场slug