使用多个表从Mysql获取不匹配和匹配的行

使用多个表从Mysql获取不匹配和匹配的行,mysql,Mysql,我在CodeIgneter上生成了这个查询,但是我没有得到预期的结果。谢谢你的帮助。问题是,如果未添加子类别,则查询无法添加所有产品 SELECT *, `products`.`created` AS `prod_created`, `products_details_translation`.`name` AS `prod_name`, `category_translation`.`name` AS `cat_name`, `subcategory_translation`.`name` A

我在CodeIgneter上生成了这个查询,但是我没有得到预期的结果。谢谢你的帮助。问题是,如果未添加子类别,则查询无法添加所有产品

SELECT *, `products`.`created` AS `prod_created`, `products_details_translation`.`name` AS `prod_name`, `category_translation`.`name` AS `cat_name`, `subcategory_translation`.`name` AS `subcat_name` 
FROM `products` 
JOIN `products_details` ON `products`.`id`=`products_details`.`product_id`  
JOIN `products_details_translation` ON `products_details`.`product_details_id`=`products_details_translation`.`product_details_id`  
JOIN `products_images` ON `products`.`id`=`products_images`.`product_id`  
JOIN `products_category` ON `products`.`id`=`products_category`.`product_id`   
JOIN `category` ON `category`.`categoryID`=`products_category`.`prod_category_id`  
JOIN `category_translation` ON `category_translation`.`categoryID`=`category`.`categoryID`   
JOIN `subcategory` ON `subcategory`.`SubCategoryID`=`products_category`.`prod_subcat_id`  
JOIN `subcategory_translation` ON `subcategory_translation`.`SubCategoryID`=`subcategory`.`SubCategoryID`  
WHERE `products_details_translation`.`abbr` = 'en' AND `category_translation`.`abbr` = 'en' AND `subcategory_translation`.`abbr` = 'en'

因为使用了,所以将记录集限制为所有表中都匹配的行。 但是,仅仅更改为外部联接是不够的,因为您还对联接列表中的最后一个表进行了筛选

  • 将联接语法更改为左联接
  • 放宽筛选条件以允许空引用
  • 但是,由于翻译筛选是选择特定语言,因此将
    1:many
    记录集转换为
    1:1或0
    我们应该将这些筛选器移动到连接条件,这将完全删除where子句

    SELECT *, `products`.`created` AS `prod_created`, `products_details_translation`.`name` AS `prod_name`, `category_translation`.`name` AS `cat_name`, `subcategory_translation`.`name` AS `subcat_name`
    FROM `products` 
    JOIN `products_details` ON `products`.`id`=`products_details`.`product_id`  
    JOIN `products_images` ON `products`.`id`=`products_images`.`product_id`  
    JOIN `products_category` ON `products`.`id`=`products_category`.`product_id`   
    JOIN `category` ON `category`.`categoryID`=`products_category`.`prod_category_id`  
    LEFT JOIN `subcategory` ON `subcategory`.`SubCategoryID`=`products_category`.`prod_subcat_id`  
    LEFT JOIN `category_translation` ON `category_translation`.`categoryID`=`category`.`categoryID` AND `category_translation`.`abbr` = 'en'
    LEFT JOIN `products_details_translation` ON `products_details`.`product_details_id`=`products_details_translation`.`product_details_id` AND `products_details_translation`.`abbr` = 'en'
    LEFT JOIN `subcategory_translation` ON `subcategory_translation`.`SubCategoryID`=`subcategory`.`SubCategoryID` AND `subcategory_translation`.`abbr` = 'en'
    
    因为使用了,所以将记录集限制为所有表中都匹配的行。 但是,仅仅更改为外部联接是不够的,因为您还对联接列表中的最后一个表进行了筛选

  • 将联接语法更改为左联接
  • 放宽筛选条件以允许空引用
  • 但是,由于翻译筛选是选择特定语言,因此将
    1:many
    记录集转换为
    1:1或0
    我们应该将这些筛选器移动到连接条件,这将完全删除where子句

    SELECT *, `products`.`created` AS `prod_created`, `products_details_translation`.`name` AS `prod_name`, `category_translation`.`name` AS `cat_name`, `subcategory_translation`.`name` AS `subcat_name`
    FROM `products` 
    JOIN `products_details` ON `products`.`id`=`products_details`.`product_id`  
    JOIN `products_images` ON `products`.`id`=`products_images`.`product_id`  
    JOIN `products_category` ON `products`.`id`=`products_category`.`product_id`   
    JOIN `category` ON `category`.`categoryID`=`products_category`.`prod_category_id`  
    LEFT JOIN `subcategory` ON `subcategory`.`SubCategoryID`=`products_category`.`prod_subcat_id`  
    LEFT JOIN `category_translation` ON `category_translation`.`categoryID`=`category`.`categoryID` AND `category_translation`.`abbr` = 'en'
    LEFT JOIN `products_details_translation` ON `products_details`.`product_details_id`=`products_details_translation`.`product_details_id` AND `products_details_translation`.`abbr` = 'en'
    LEFT JOIN `subcategory_translation` ON `subcategory_translation`.`SubCategoryID`=`subcategory`.`SubCategoryID` AND `subcategory_translation`.`abbr` = 'en'
    

    亲爱的克里斯,非常感谢。我现在使用行查询获得了结果,但未能进入codeigneter,因为我得到的错误是“en”不是on子句上的一列,如:$this->_categoryTranslatable.'.categoryID='.$this->_categoryTable.'.categoryID和'.$this->_categoryTranslatable.'.abr=
    en
    ,“LEFT”);这听起来像是一个文本编码问题,请确保
    'en'
    作为字符串传递,或者最好使用参数亲爱的Chris,非常感谢。我现在使用行查询获得了结果,但未能进入codeigneter,因为我得到的错误是“en”不是on子句上的一列,如:$this->_categoryTranslatable.'.categoryID='.$this->_categoryTable.'.categoryID和'.$this->_categoryTranslatable.'.abr=
    en
    ,“LEFT”);这听起来像是文本编码问题,请确保
    'en'
    作为字符串传递,或者最好使用参数