【问题标题】:MySQL query using 4 tables, LEFT JOINs and WHERE EXISTSMySQL 查询使用 4 个表,LEFT JOINs 和 WHERE EXISTS
【发布时间】:2012-11-23 11:52:22
【问题描述】:

我总共需要处理四 (4) 个表格。本质上,一个从另一个拉取数据,从另一个拉取数据以获取以前的表格数据,依此类推。

我无法获取将成功运行而不会超时的查询。我想在ORDERMONTH 中显示商品的VISITSVISITSVISITS 及其在给定时间段内的总销售额

表结构

table1 (WebVisits)
ID   DATE        WEBNUMBER  VISITS
1    2012-01-01  apw-rtr8   2
..   ...         ...        ..


table2 (Commodities)
ID      WEBNUMBER   TIER1
5791    apw-rtr8    Refrigeration
..      ...         ...


table3 (Attributes)
ITEM        WEB_NUM
APW-RTR-8   apw-rtr8
..          ...


table4 (SalesData)
ID     ITEM        QUANTITY  UNIT_PRICE  TRANS_DATE
31905  APW-RTR-8   1         1522.38     2012-02-05
..     ...         ...       ...         ...

SELECT 
    MONTH(t1.DATE) AS MONTH, 
    SUM(t1.VISITS) as Visits,
    t2.TIER1 as Category
FROM
    table1 t1
        LEFT JOIN
    table2 t2 ON t1.WEBNUMBER = t2.WEBNUMBER
        LEFT JOIN
    table3 t3 ON t2.WEBNUMBER = t3.WEB_NUM
WHERE
    t1.DATE BETWEEN '2012-01-01' AND '2012-05-31'
        AND t3.TIER1 = 'Cooking Equipment '
        AND EXISTS( SELECT 
            sum(t4.UNIT_PRICE * t4.QUANTITY) as total
        FROM
            table4 t4
        WHERE
            t4.ITEM = t3.ITEM
                AND t4.TRANS_DATE BETWEEN '2012-01-01' AND '2012-05-31')
GROUP BY MONTH
ORDER BY MONTH

基本上,类别 (TIER1) 是已知的,并且日期范围是已知的。鉴于上面的查询,我希望它吐出与此类似的结果:

MONTH   Visits  Total     Category
1       4054    32058.08  Cooking Equipment 
2       3564    28116.17  Cooking Equipment 
3       4514    25819.66  Cooking Equipment 
4       3621    18732.96  Cooking Equipment 
5       6521    55378.11  Cooking Equipment 

【问题讨论】:

    标签: mysql join exists


    【解决方案1】:

    我开始写查询,发现我写的查询几乎和你写的一样。

    确保存在以下indexes

    table1.DATE
    table1.WEBNUMBER
    table2.WEBNUMBER
    table3.WEB_NUM
    table4.ITEM
    table4.TRANS_DATE
    

    编辑:

    试试这个:

    SELECT 
        MONTH(table1.DATE) AS MONTH, 
        SUM(table1.VISITS) as Visits, 
        table2.TIER1 as Category, 
        SUM(table4.UNIT_PRICE * table4.QUANTITY) 
    FROM table1 
    LEFT JOIN table2 USING(WEBNUMBER) 
    LEFT JOIN table3 table1.WEBNUMBER = table3.WEB_NUM 
    LEFT JOIN table4 table1.WEBNUMBER = table4.ITEM 
    WHERE table2.TIER1 = 'Cooking Equipment' 
    AND table4.TRANS_DATE BETWEEN '2012-01-01' 
    AND '2012-05-31' 
    GROUP BY MONTH 
    ORDER BY MONTH
    

    【讨论】:

    • table1 ID 是主要的 | table2 ID 是主要的,WEBNUMBER 是索引 | table3 ITEM 是主要的,WEB_NUM 是索引 | table4 ID 是主要的
    • 谢谢,这是一个很好的开始。我已按照您的指示添加了索引,并且查询运行得非常快。我必须添加WHERE AND table2.TIER1 ='Cooking Equipment '
    • 没问题!我看到我完全错过了 WHERE 语句和 table2.TIER 部分,添加它。
    • 所以我做了更彻底的测试,结果并不准确。我的主要目标是在给定时间段内简单地跟踪这些产品的销售情况
    • VISITS 和总销售额高度膨胀...我相信这与SUM 属性有关?
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2020-05-05
    • 2016-02-07
    • 1970-01-01
    相关资源
    最近更新 更多