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

标签 php mysql database inner-join

如何在 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/

相关文章:

php - Laravel orwhere 和 whereBetween 查询不能一起工作

php - Class::save() 的声明应该与 Class::save() 的声明兼容

mysql - 如何通过字段的子值之一查询 MySQL?

mysql - 从 MySQL 中的多个表中获取多行中的多个值

mysql - 在 PostgreSQL 中使用嵌套查询进行更新,但出现不需要的结果

php - 如何在使用 php 和 mysql 驱动数据库的网站中查看用户是否在线?

javascript - Reactjs:在嵌套数组上使用 map() 时遇到挑战

javascript - 使用正则表达式进行表单验证

php - 将我的主导航定位在我居中的 Logo 下方。包括图像

php - 使用whereIn form sql数据库获取重复数据