【问题标题】:MySQL Multiple JoinMySQL 多重连接
【发布时间】:2013-01-16 22:47:42
【问题描述】:

我创建了以下查询,它从 3 个不同的表中提取数据:

    SELECT
    product_searchables_names.class_name AS Class_Name,
    product_searchables_names.label AS Attribute_Label,
    jss_products.extrafield102 AS Attribute1,
    jss_products.extrafield103 AS Attribute2,
    jss_products.extrafield104 AS Attribute3,
    jss_products.extrafield105 AS Attribute4,
    jss_products.extrafield106 AS Attribute5,
    jss_products.extrafield107 AS Attribute6
    FROM
    product_searchables_categories 
    JOIN product_searchables_names ON product_searchables_categories.searchableID = product_searchables_names.ID
    JOIN jss_products ON product_searchables_categories.categoryID = jss_products.categories
    WHERE
    jss_products.productID = '134890'
    ORDER BY
    product_searchables_categories.searchable_order ASC

以如下格式输出数据

但我需要这种格式,其中第 1 行从 'Attribute'1 中选择值,从 'Attribute2' 中选择第 2 行等:

我该怎么做?

提前致谢

【问题讨论】:

  • 你能把每个表的表结构和一些示例数据贴出来吗?

标签: mysql join


【解决方案1】:

你可以试试http://dev.mysql.com/doc/refman/5.1/de/case-statement.html这样的case语句

select
    product_searchables_names.class_name AS Class_Name,
    product_searchables_names.label AS Attribute_Label,
    CASE 
        WHEN product_searchables_names.label = 'Resolution' THEN jss_products.extrafield104
        WHEN product_searchables_names.label = 'Networked?' THEN jss_products.extrafield106
        WHEN ...
    END
from
    product_searchables_categories
...

或使用 class_name 代替标签

【讨论】:

  • 嗨,这适用于这个特定的产品 ID,但由于有超过 200 个不同的属性标签,这不适用于数据库范围,不过感谢您的建议! :)
  • 但我想,您仍然需要在 class_name 和属性字段之间进行某种映射...
  • 我已经设法适应了你的想法,每个标签都有一个唯一的 id,所以我只是做了 CASE WHEN product_searchables_id.label = '1' THEN jss_products.extrafield102 等...
  • 我当然愿意,但我只有 10 个声望,投票需要 15 个!但是非常感谢!
【解决方案2】:

您正在寻找的是一个支点。我知道如何在 Oracle 中做到这一点,但我不相信在 mysql 中有一种简单的方法可以做到这一点。得到结果集后,在代码中执行此操作通常比在 SQL 中容易得多。

这里有一篇文章描述了如何使用 CASE 进行操作,这类似于 Oracle 方法。

mysql pivot query results with GROUP BY

【讨论】:

    【解决方案3】:

    根据您发布的图片,您似乎需要unpivot jss_products 表。此过程将获取您的列值并将其转换为行。

    所以您的查询将与此类似:

    SELECT psn.class_name AS Class_Name,
        psn.label AS Attribute_Label,
        jp.Attribute
    FROM product_searchables_categories psc
    JOIN product_searchables_names psn
        ON psc.searchableID = psn.ID
    JOIN
    (
        select productID, categories, jp.extrafield102 as Attribute
        from jss_products jp
        union all
        select productID, categories, jp.extrafield103 as Attribute
        from jss_products jp
        union all
        select productID, categories, jp.extrafield104 as Attribute
        from jss_products jp
        union all
        select productID, categories, jp.extrafield105 as Attribute
        from jss_products jp
        union all
        select productID, categories, jp.extrafield106 as Attribute
        from jss_products jp
        union all
        select productID, categories, jp.extrafield107 as Attribute
        from jss_products jp
    ) jp    
        ON psc.categoryID = jp.categories
    WHERE jp.productID = '134890'
    ORDER BY psc.searchable_order ASC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多