gpt4 book ai didi

php - 内连接 MYSQL 查询组合 3 个表

转载 作者:搜寻专家 更新时间:2023-10-30 23:37:40 27 4
gpt4 key购买 nike

如何在 INNER JOIN 中合并 3 个表?

我得到的最终结果是获得属于产品的类别列表 - 包括类别的父 ID 类别值(即:运动鞋和耐克)。

CATEGORIES 表和 PRODUCTS 表在 PRODUCTS & CATEGORIES 表中联接。一个产品可以属于多个类别,一个类别可以有多个产品。

这或多或少是我在数据库中的设置...

类别表:

CAT ID | PARENT ID | CATEGORY
1 | 0 | Sneakers
2 | 1 | Nike
3 | 2 | Jordan

产品表:

PROD ID 
1
2
3

产品和类别表:

CAT ID | PROD ID
1 | 0
1 | 1
2 | 3

我正在运行这些查询并得到了一些结果,但目前我正在运行 2 个单独的查询...

$q1 = "SELECT prodid, GROUP_CONCAT(catid SEPARATOR ' // ') as catid FROM products_categories group by prodid order by prodid";
$result1 = $conn->query($q1);

if ($result1->num_rows > 0) {
while($prods = $result1->fetch_assoc()) {
echo "Product Id:" . $prods["prodid"] . " ––> " . "Categories Id:" . $prods["catid"];
}
} else {
echo "0 results";
}

$q2 =
" SELECT `ID`.`category` as `IDName`, `LABEL`.`category` as `LabelName`, `LABEL`.`catid` as `LabelId`
FROM `categories` as ID
INNER JOIN `categories` as LABEL
ON `ID`.`catid` = `LABEL`.`parentid`";
$result2 = $conn->query($q2);

if ($result2->num_rows > 0) {
while($prods = $result2->fetch_assoc()) {
echo "ID# " . $prods["LabelId"] . " is called: ". $prods["LabelName"] . "<br>";
}
} else {
echo "0 results";
}
$conn->close();

我尝试添加另一个 INNER JOIN,但没有成功。我所追求的最终结果是:PROD ID #0 属于 Sneakers, Nike, Jordan。谁能指出我正确的方向?

非常感谢,

塞尔吉奥


更新 - 2016 年 10 月 11 日

查询:

$q =
" SELECT PC.productid as productid, concat_WS('~',C1.category, C2.category, C3.category) as breadcrumb
FROM xcart_categories as C1

INNER JOIN xcart_products_categories as PC
ON C1.categoryid = PC.categoryid

LEFT JOIN xcart_categories as C2
ON C1.categoryid = C2.parentid
AND C1.parentid = 0

LEFT JOIN xcart_categories as C3
ON C2.categoryid = C3.parentid
WHERE C1.parentid = 0
";

获取:

$result = $conn->query($q);

if ($result->num_rows > 0) {
while($prods = $result->fetch_assoc()) {
echo $prods['productid'] . ' Belongs in these categories: ' . $prods['breadcrumb'] . '<br>';
}
} else {
echo "0 results";
}

最佳答案

这假设不再有 3 层层次结构,并且需要单独的连接来“将每条记录放在同一行上”,以便它们可以组合成单个值结果。我认为您正在尝试使用 Group_concat,但我看不出这将如何工作,因为您无法遍历层次结构。

SELECT PC.ProductID,  concat_WS('-',C1.Category, C2.Category, C3.Category) as breadcrumb
FROM categories C1
INNER JOIN ProductsCategories PC
on C1.categoryID = PC.CategoryID
LEFT JOIN categories C2
on c1.CategoryID = C2.ParentID
and C1.parentID = 0
LEFT Join Categories C3
on C2.CategoryID = C3.ParentID
WHERE C1.ParentID = 0

工作 SQL Fiddle示例(这仅支持 3 级深度,但可以通过添加左连接来更改以支持最大级别但不支持未确定的最大级别..)

我看到您正在尝试使用 group concat 将同一产品类别的所有行。productID 为 0 到同一行

然而,当 0 引用 1 的 catID 时,它只会在内部连接上返回“sneakers”。您需要以某种方式遍历树(所有树),因此如上所述,或者您必须多次访问数据库或使用某种动态 SQL 或评论链接中提到的方法。

这在 SQL Server、Oracle 或其他企业 RDBMS 系统中相当简单,但是如果没有递归查询或特定于引擎的层次结构查询,这在 MySQL 中一次完成就不是一件容易的事。

也许我遗漏了一些东西,所以它可能有助于查看示例数据的实际预期结果。您想要返回的记录集是什么样的?

关于php - 内连接 MYSQL 查询组合 3 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39707442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com