为内部联接查询中的一个字段选择不同的值
Posted
技术标签:
【中文标题】为内部联接查询中的一个字段选择不同的值【英文标题】: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);
【问题讨论】:
【参考方案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 不能,因为每一列都有不同的值。以上是关于为内部联接查询中的一个字段选择不同的值的主要内容,如果未能解决你的问题,请参考以下文章
仅从 Spring Data JPA 中的联接表(多对多)中选择特定列