过滤 qry 以根据另一个表获取数据

问题描述

这是获取数据库中所有可用类别的查询

$sql = "SELECT cp.category_id AS category_id,GROUP_CONCAT(cd1.name ORDER BY cp.level SEParaTOR '  >  ') AS name,c1.parent_id,c1.sort_order 
    FROM " . DB_PREFIX . "category_path cp 
    LEFT JOIN " . DB_PREFIX . "category c1 ON (cp.category_id = c1.category_id) 
    LEFT JOIN " . DB_PREFIX . "category c2 ON (cp.path_id = c2.category_id) 
    LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id) 
    LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id) 
    WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND 
    cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";

得到这个输出

enter image description here

所以,我试图只获得列在 rma_mapping_category(这里有 category_id 列)

所以我尝试了这个,但是通过添加 this(AND rma_mapping_category rma) 语法出错了... //////////////////// /

$sqs = "SELECT cp.category_id AS category_id,c1.sort_order 
        FROM " . DB_PREFIX . "category_path cp AND rma_mapping_category rma
        LEFT JOIN " . DB_PREFIX . "category c1 ON (cp.category_id = c1.category_id) 
        LEFT JOIN " . DB_PREFIX . "category c2 ON (cp.path_id = c2.category_id) 
  ->    LEFT JOIN " . DB_PREFIX . "category c3 ON (rma.categoryid = c3.category_id) 
        LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id) 
        LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id) 
        WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND 
        cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";

也试过这个... //////////////////// 这样我得到了所有类别,而不仅仅是rma_mapping_category

结果与第一次查询相同。

$sqs = "SELECT cp.category_id AS category_id,c1.sort_order 
        FROM " . DB_PREFIX . "category_path cp
        LEFT JOIN " . DB_PREFIX . "category c1 ON (cp.category_id = c1.category_id) 
        LEFT JOIN " . DB_PREFIX . "category c2 ON (cp.path_id = c2.category_id) 
        LEFT JOIN rma_mapping_category rma ON (cp.category_id = rma.category_id) 
        LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id) 
        LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id) 
        WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND 
        cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";

任何建议,我应该尝试什么?任何帮助将不胜感激。

解决方法

您可以从递归查询开始。

示例:要获取 category_id 20 下的所有子类别,我将使用以下查询:

WITH RECURSIVE cte (category_id,path_id) AS (
  SELECT     category_id,path_id
  FROM       oc_category
  WHERE      path_id = 20
  UNION ALL
  SELECT     c.category_id,c.path_id
  FROM       oc_category c
  INNER JOIN cte
          ON c.path_id = cte.path_id
)
SELECT * FROM cte JOIN `oc_category_description` cd ON cd.category_id = cte.category_id;

with 关键字有什么神奇之处。感谢 this 对过去帮助我解决此问题的另一个问题的回答。

,

添加 == 后查询按预期工作

INNER JOIN rma_mapping_category rma ON (cp.category_id = rma.category_id) 如下所示

    $sql = "SELECT cp.category_id AS category_id,GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR '  >  ') AS name,c1.parent_id,rma.type_id,c1.sort_order 
    FROM " . DB_PREFIX . "category_path cp
    LEFT JOIN " . DB_PREFIX . "category c1 ON (cp.category_id = c1.category_id) 
    LEFT JOIN " . DB_PREFIX . "category c2 ON (cp.path_id = c2.category_id) 
    LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (cp.path_id = cd1.category_id) 
    LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id)
    INNER JOIN rma_mapping_category rma ON (cp.category_id = rma.category_id) 
    WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND 
    cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";