内连接MYSQL查询组合3个表

时间:2016-09-26 16:03:36

标签: php mysql database inner-join

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

我所得到的最终结果是获得属于PRODUCT的CATEGORIES列表 - 包括CATEGORY&S#PARENT ID CATEGORY值(即:Sneakers和Nike)。

CATEGORIES表和PRODUCTS表已加入PRODUCTS&类别表。一个产品可以属于许多类别,一个类别可以有许多产品。

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

类别表:

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 属于运动鞋,耐克,乔丹。 任何人都能指出我正确的方向吗?

非常感谢你,

塞尔吉奥

更新 - 10/11/16

查询:

$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";
   }

1 个答案:

答案 0 :(得分:1)

这假设不再有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将同一产品category.productID为0的所有行带到同一行

然而,当0引用catID为1时,它只返回内连接上的“运动鞋”。您需要以某种方式遍历树(所有这些),因此上面,或者您必须多次访问数据库或使用注释中链接中提到的某种动态SQL或方法。

这在SQL Server,Oracle或其他Enterprise RDBMS系统中相当简单,但是如果没有递归查询或引擎特定的层次结构查询,这在MySQL的单次旅行中绝非易事。

也许我遗漏了一些内容,因此查看样本数据的实际预期结果可能会有所帮助。什么是你想要的记录集?