mysql - 可以通过一个查询引用两个特定的表

标签 mysql database join left-join

这已经涉及到四个 INNER JOIN 和一个 LEFT JOIN,但我不确定如何再引用一个与 LEFT JOIN 表类似的表。

这是我当前的查询,它按预期工作

 SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt
    FROM xcart_products xp
    INNER JOIN xcart_variants xv ON xp.productid = xv.productid
    INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid
    INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid
    INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR'
    LEFT JOIN xcart_images_W xiW ON xiW.id = xvi.variantid
    GROUP BY xco.optionid
    ORDER by xp.product DESC

所以基本上每个产品都有一个类别和一个变体,然后每个类别都有类别选项,每个变体都有变体项目。变体有自己的变体图像,每个类都有自己的“详细”图像 (xcart_images_D)。截至目前,我正在引用变体图像,但我想做的不是计算 xvi.variantid,而是计算每个 optionid 有多少详细图像。

我有一个查询可以执行此操作,但遗憾的是我无法使用此查询来提取 xcart_images_W。该查询是 belo

 SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiD.image_path, xiD.path_on_server, count(xiD.optionid) as cnt
    FROM xcart_products xp
    INNER JOIN xcart_classes xc ON xp.productid = xc.productid AND xc.class = 'Color'
    INNER JOIN xcart_class_options xco ON xc.classid = xco.classid
    LEFT JOIN xcart_images_D xiD ON xiD.optionid = xco.optionid
    GROUP BY xp.product, xco.optionid
    ORDER by xp.product DESC

是否可以引用这两个表,或者它们的外键是否无法引用?

下面我提供了表格结构。

+ xcart_products
    - productid*
    - product
+ xcart_variants
    - variantid*
    - productid (xcart_products.productid)
+ xcart_variant_items [bridge table]
    - optionid*
    - variantid (xcart_variants.variantid)
+ xcart_classes
    - classid*
    - productid (xcart_products.productid)
    - class
+ xcart_class_options
    - optionid*
    - option_name
    - classid (xcart_classes.classid)
+ xcart_images_W
    - imageid*
    - id (xcart_variants.variantid)
    - image_path
+ xcart_images_D
    - imageid* [not relational with xcart_images_W.imageid]
    - id (xcart_products.productid)
    - optionid (xcart_class_options.optionid)
    - image_path

* Primary Key
() relational data
[] notes

当前工作但困惑的查询。我该如何清理?

 SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path
 FROM xcart_products xp
 INNER JOIN xcart_variants xv ON xp.productid = xv.productid
 INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid
 INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid
 INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR'
 LEFT JOIN xcart_images_W xiW ON xiW.id = xvi.variantid
 LEFT JOIN (
 SELECT COUNT(xiD.optionid) as dCount 
    FROM xcart_products xp2
    INNER JOIN xcart_classes xc2 ON xp2.productid = xc2.productid AND xc2.class = 'Color'
    INNER JOIN xcart_class_options xco2 ON xc2.classid = xco2.classid
    LEFT JOIN xcart_images_D xiD ON xiD.optionid = xco2.optionid
 ) ON xiW.id = xvi.variantid
 GROUP BY xco.optionid
 ORDER by xp.product DESC

最佳答案

在您提供表定义之前,它并不完全清楚。您是否尝试在第一个查询中用 count(xiW.id) 替换 count(xvi.variantid)?

更新:

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt
FROM xcart_products xp
INNER JOIN xcart_variants xv ON xp.productid = xv.productid
INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid
INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid
INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR'
LEFT JOIN (
   SELECT COUNT(xiD.id) as Dcount 
   FROM xcart_images_D xiD 
   INNER JOIN xcart_images_W xiW ON xiW.column = xiD.column /*please update accordingly */
 ) ON xiW.id = xvi.variantid 
GROUP BY xco.optionid
ORDER by xp.product DESC

再次更新:

SELECT xp.productid, xp.product, xc.classid, xco.optionid, xco.option_name, xiW.id, xiW.image_path, count(xvi.variantid) as cnt, xiD.totalD
FROM xcart_products xp
INNER JOIN xcart_variants xv ON xp.productid = xv.productid
INNER JOIN xcart_variant_items xvi ON xv.variantid = xvi.variantid
INNER JOIN xcart_class_options xco ON xvi.optionid = xco.optionid
INNER JOIN xcart_classes xc ON xco.classid = xc.classid AND xc.class = 'COLOR'
LEFT JOIN (
   SELECT count(xiD.id) as totalD, xiD.optionid FROM xcart_images_D xiD WHERE xiD.optionid = xvi.optionid
) ON xiD.optionid = xvi.optionid
GROUP BY xco.optionid
ORDER by xp.product DESC

关于mysql - 可以通过一个查询引用两个特定的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536437/

相关文章:

mysql - 需要一个sql高效查询

vba - 使 MS Access 中的查询在打印时默认为横向

PHP MySQL 双内连接

php - 如何在php mysql中更新多个选择框的值

mysql - 需要帮助在 mysql 中构建哈希标签趋势查询

php - 在 Php 数组中搜索字符串并提取相邻文本

mysql - SQL - 有没有更好的方法来处理一个表上的多个事务?

mysql - 什么在表上运行优化会产生如此巨大的差异?

mysql - 关于将 Join Query 转换为 Nested Subquery 的说明

sql - SQL:如何基于最大日期时间为多个ID选择单个记录?