Php 结合3个表的内部联接MYSQL查询

Php 结合3个表的内部联接MYSQL查询,php,mysql,database,inner-join,Php,Mysql,Database,Inner Join,如何在内部联接中组合3个表 我追求的最终结果是获得属于某个产品的类别列表,包括该类别的父ID类别值(即:运动鞋和Nike) 类别表和产品表在产品和类别表中联接。一个产品可以属于多个类别,一个类别可以有多个产品 这是我在数据库中的大致设置 类别表: CAT ID | PARENT ID | CATEGORY 1 | 0 | Sneakers 2 | 1 | Nike 3 | 2 | Jordan PROD ID 1

如何在内部联接中组合3个表

我追求的最终结果是获得属于某个产品的类别列表,包括该类别的父ID类别值(即:运动鞋和Nike)

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

这是我在数据库中的大致设置

类别表:

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
产品表:

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
产品和类别表:

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
我正在运行这些查询并得到一些结果,但目前我正在运行两个单独的查询

$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();
提取:

$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";
   }
$result=$conn->query($q);
如果($result->num_rows>0){
而($prods=$result->fetch_assoc()){
echo$prods['productid']”属于以下类别:“.$prods['breadcrumb']”。
; } }否则{ 回显“0结果”; }
这假定不再有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
工作示例(这仅支持3个级别的深度,但可以通过添加左连接进行更改,以支持最大级别,但不支持未确定的最大级别..)

我看到您试图使用group concat将同一product category.productID为0的所有行带到同一行

但是,由于0引用catID为1,因此它只会在内部联接上返回“sneakers”。您可能需要以某种方式遍历树(所有树),因此如上所述,或者您必须多次访问数据库,或者使用注释中链接中提到的某种动态SQL或方法

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


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

看起来类别表是一个层次结构。MySQL不直接支持分层查询。有几种方法可以模拟这种行为:引用:(端点):我知道MYSQL不支持分层查询,但内部连接不处理查询的这一部分吗?还是我错过了内在连接的要点?谢谢你的帮助。。。。concat集团基本上是将与该特定产品相关的每一个类别(父母、子女、孙子等)都纳入其中,并用“/”分隔。这很好,但我需要将类别ID(父母、孩子、孙子等)更改为其实际值(运动鞋、Nike、Jordan)-而不是ID号。我给你举个例子。你在CL1.ID=CL2上的
上提到的“ID”。ParentID
是指类别表中的CAT ID吗?下面是一张图片,说明了我希望实现的目标,以及更精确的数据库设置。顶部显示了一个产品页面的示例…产品名称(车牌持有者)下方是用户进入该页面的假设路径。下面的灰色方框是我真正想要完成的,那就是列出所有其他的汽车品牌、型号和年份,这个特定的车牌也适合/属于。图片链接:更新并添加了一个显示productID和面包屑的提琴。谢谢xQbert…它正在工作,但只显示了只有2个深度的产品,意思是->本田-思域。我们有300多种产品,其中只有大约6种产品有2种深度,这是唯一展示的产品。