【问题标题】:Select Distinct value for one field on Inner Join Query为内部联接查询中的一个字段选择不同的值
【发布时间】:2016-04-08 21:37:13
【问题描述】:

我想从两个表格创建摘要报告。一张桌子project_type 另一张桌子ffw

ffw

|-----------------------------------------------------------------------|
| ffw_id    | division_id   | district_id   | project_type_id | name
|-----------------------------------------------------------------------|
| 1         | 30            | 1             |     2           |myAddress
|-----------------------------------------------------------------------|
| 2         | 12            | 2             |     1           | Asdfads |
|-----------------------------------------------------------------------|
| 3         | 30            | 6             |     1           | kkkkk   |
|-----------------------------------------------------------------------|
|  ..       | ..            | ..            |     ..          | .....   |
|-----------------------------------------------------------------------|

project_type

|--------------------------------
| project_type_id | project_type | 
|--------------------------------|
| 1               | food         |
|--------------------------------|
| 2               | work         |
|--------------------------------|
| 3               | visit        |
|--------------------------------|
| ..              | ..           |
|--------------------------------|

应用division_id 条件后,我希望从这两个表中得到的结果将是

|-------------------------------------------|
| no        | project_type  | count         | 
|-------------------------------------------|
| 1         | food          | 2             |
|-------------------------------------------|
| 2         | work          | 1             |
|-------------------------------------------|
| 3         | visit         | .             |
|-------------------------------------------|
|  ..       | ..            | ..            |
|-------------------------------------------|

我正在尝试这段代码,但它在 while 循环中显示重复值

$qry = "
    SELECT * FROM `project_type` 
    LEFT JOIN `ffw` 
        ON project_type.project_type_id = ffw.project_type_id
    WHERE 1
";

if (strlen($_POST["division_id"]) > 0 && $_POST["division_id"] != "0")
{
    $qry .= " AND division_id = '".$_POST["division_id"]."'";
}

$query = mysql_query($qry);

【问题讨论】:

    标签: php mysql join inner-join


    【解决方案1】:

    您可以使用 GROUP BY 来总结结果:

    SELECT pt.project_type, count(*) as count FROM project_type pt
    LEFT JOIN ffw ff ON ff.project_type_id = pt.project_type_id
    GROUP BY pt.project_type
    

    此查询将返回您的记录摘要。

    这是使用 MYSQLi 面向对象的完整代码示例:

    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";
    
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    $sql = "SELECT pt.project_type, count(*) as count FROM project_type pt
    LEFT JOIN ffw ff ON ff.project_type_id = pt.project_type_id
    WHERE 1 = 1 
    ";
    
    
    if(strlen($_POST["division_id"])> 0 && $_POST["division_id"]!="0")
    {
        $sql.= " AND division_id = '".$_POST["division_id"]."'";
    }
    
    $sql .= "GROUP BY pt.project_type";
    
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        $i = 1;
        // output data of each row
        while($row = $result->fetch_assoc()) {
            echo $id. " - Name: " . $row["project_type"]. " " . $row["count"]. "<br>";
            $i++;
        }
    } 
    else 
    {
        echo "0 results";
    }
    $conn->close();
    

    旁注:我建议使用 mysqli_* 或 PDO,因为 mysql_* 已被弃用并且它在 PHP 7 中不可用

    【讨论】:

    • 谢谢。如果我想要 ffw 的所有字段值,你能提出更多建议吗?从这个查询中,我得到了左表的值和右表的计数。如果我想*来自 ffw
    • 我的朋友,如果你需要ffw的所有记录,结果可能会有所不同,因为group by....
    • ok 如果我发现问题,我会通知你。现在我可以了。
    【解决方案2】:

    您可以使用group_by 并获得如下计数:

    $qry="SELECT pt.project_type_id as no, pt.project_type, count(*) as count FROM project_type pt LEFT JOIN ffw ON pt.project_type_id=ffw.project_type_id";
    
    if(strlen($_POST["division_id"])>0&&$_POST["division_id"]!="0")
    {
         $qry.=" Where division_id='".$_POST["division_id"]."'";
    }
    
    $qry.=" GROUP BY pt.project_type";
    

    【讨论】:

    • 是的,很有帮助。如果我想要 ffw 中的所有字段值,你能建议多一点吗?
    • @LemonKazi 你得到预期的结果了吗?
    • 我认为它不会起作用,因为 select 只能包含 Group By 子句或聚合函数中的那些列。
    • @MohitAggarwal:是的,你是对的,project_type.* 可以与 group by 一起正常工作,但是 ffw 不能,因为每一列都有不同的值。
    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2012-04-13
    • 2013-12-16
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多