根据同一记录中的值选择字段

时间:2014-06-17 14:39:03

标签: mysql sql outer-join

我想SELECT基于ID值的字段。

Products
    PRODUCT_ID    Name
    19            Chair
    20            Table

Product_fields
    ID    PRODUCT_ID    TYPE    DESCRIPTION
    1     19            C       White
    2     19            S       Modern
    3     20            C       Black
    4     20            S       Classic

我需要一个结果:

Product     Type_C   Type_S
Chair       White    Modern
Table       Black    Classic

我能够在product_fields表上使用两个LEFT JOINs生成此内容,但这会使查询速度过慢。还有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

减慢查询的速度是多少?什么是可以接受的?

如果您真的不想使用联接(您必须有一个联接),请使用视图或嵌套查询。但我不认为它们会更快,不过你可以尝试一下。

查看sqlfiddle

上的观看次数
select  p.PRODUCT_ID, p.Name, f.CDescription, f.SDescription
from    Products p
join(
    SELECT  PRODUCT_ID, Max( CDescription ) as CDescription,
            Max( SDescription ) as SDescription
    FROM(
        select  PRODUCT_ID,
                case Type when 'C' then Description end as CDescription,
                case Type when 'S' then Description end as SDescription
        from    Fields
      ) x
    group by PRODUCT_ID
) f
on  f.PRODUCT_ID = p.PRODUCT_ID;

答案 1 :(得分:0)

完整的陈述是:

SELECT 
    NL.product_name,
    PRD.product_sku AS product_sku,
    CF.virtuemart_product_id AS virtuemart_product_id,
    GROUP_CONCAT(distinct CFA.customsforall_value_name
        ORDER BY CFA.customsforall_value_name ASC
        separator  ' | ' ) AS Name_exp_3,
    ROUND((((prices.product_price * CALC.calc_value) / 100) + prices.product_price),
            2) AS Prijs,
    VMCF_L.custom_value AS latijn,
    VMCF_T.custom_value AS THT
    VMCF_B.custom_value AS Batch
from j25_virtuemart_products AS PRD 
    LEFT join j25_virtuemart_product_custom_plg_customsforall AS CF     ON CF.virtuemart_product_id = PRD.virtuemart_product_id
    join j25_virtuemart_product_prices AS prices                ON PRD.virtuemart_product_id = prices.virtuemart_product_id
    join j25_virtuemart_calcs AS CALC                           ON prices.product_tax_id = CALC.virtuemart_calc_id
    join j25_virtuemart_products_nl_nl AS NL                    ON NL.virtuemart_product_id = PRD.virtuemart_product_id
    LEFT join j25_virtuemart_product_customfields AS VMCF           ON VMCF.virtuemart_product_id = PRD.virtuemart_product_id
    LEFT join j25_virtuemart_custom_plg_customsforall_values AS CFA     ON CFA.customsforall_value_id = CF.customsforall_value_id
    LEFT JOIN j25_virtuemart_product_customfields AS VMCF_L ON VMCF.virtuemart_product_id = VMCF_L.virtuemart_product_id AND VMCF_L.virtuemart_custom_id = 16
    LEFT JOIN j25_virtuemart_product_customfields AS VMCF_T ON VMCF.virtuemart_product_id = VMCF_T.virtuemart_product_id AND VMCF_T.virtuemart_custom_id = 3
    LEFT JOIN j25_virtuemart_product_customfields AS VMCF_B ON VMCF.virtuemart_product_id = VMCF_B.virtuemart_product_id AND VMCF_B.virtuemart_custom_id = 18
WHERE
    PRD.product_sku like '02.%'
group by PRD.virtuemart_product_id
order by NL.product_name;

其中名为'Latijn','THT'和'Batch'的三个SELECT结果是我之前比较为黑/白和经典/现代值的结果。 希望这有任何意义。 正如您所看到的,这涉及到Virtuemart的安装,因此我无法对模式进行多少讨论。

当我排除底部的3个JOINS并且存在相关的FIELDS时,查询大约需要0.5秒。包含JOINS和FIELDS后,查询大约需要19秒。

我从这个完整的查询中创建了一个视图,我从我的标签应用程序中查询。

答案 2 :(得分:0)

谢谢大家!根据您的输入我创建: select NL .这里给AS这里给, PRD . product_sku AS product_sku , CF . virtuemart_product_id {{ 1}} virtuemart_product_id AS CFA , group_concat(distinct customsforall_value_name . CFA order by customsforall_value_name . Name_exp_3 ASC separator ' | ') AS价格, round(((( PRODUCT_PRICE {{1} } CALC . calc_value *价格. PRODUCT_PRICE ) / 100) + Prijs . F到), 2) AS Latijn , Latijn . F到AS THT , THT . F到AS批次, 批次. j25_virtuemart_products AS PRD from ((((((( j25_virtuemart_product_custom_plg_customsforall {{ 1}} CF CF left join virtuemart_product_id PRD ON (( virtuemart_product_id . j25_virtuemart_product_prices =价格. PRD {{1} } virtuemart_product_id ))) join价格 virtuemart_product_id ON (( j25_virtuemart_calcs . CALC =价格. product_tax_id ))) join CALC virtuemart_calc_id ON (( j25_virtuemart_products_nl_nl . NL = NL . virtuemart_product_id ))) join PRD virtuemart_product_id ON (( j25_virtuemart_product_customfields . VMCF {{ 1}} {VMCF {1}} {virtuemart_product_id {1}} {PRD {1}} virtuemart_product_id {{1 }} j25_virtuemart_custom_plg_customsforall_values = CFA . CFA ))) left join customsforall_value_id CF ON (( customsforall_value_id . vw_batch_Latijn_THT_grouped = F到. ˚F))) left join virtuemart_product_id PRD ON (( virtuemart_product_id . PRD = product_sku . PRD ))) left join virtuemart_product_id NL { {1}} product_name``

执行需要1.4秒,比我开始的19秒快一点。