使用 4 个表、LEFT JOIN 和 WHERE EXISTS 的 MySQL 查询

标签 mysql join exists

我总共需要使用四 (4) 个表。本质上,一个从另一个提取数据以获取数据,另一个从另一个提取数据以获取先前的表数据等等。

我在获取能够成功运行而不会超时的查询时遇到问题。我想显示某种商品的 VISITSSUM,以及 MONTH 的 ORDER 给定时间段内的总销售额

表结构

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 

最佳答案

我开始编写查询,并意识到我编写的查询与您编写的查询几乎相同。

确保以下索引存在:

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

关于使用 4 个表、LEFT JOIN 和 WHERE EXISTS 的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726889/

相关文章:

php - 在mysql查询中设置多个order by

php - SQL UPDATE 如果密码正确

MySQL查询以列出不是特定类型的项目

r - 如何检查 R 函数的输入参数是否存在

c# - 如果存在于 XmlNodeList C# 中的 XML 节点上

php - MySQL 获取多个表,join

mysql - 尝试从 MySQL 读取时出现 "Object Reference not Set to an Instance of an Object"

mysql - 查询 2 个表 - JOIN

mysql - 如何在没有 ON 条件的情况下使用 mysql JOIN?

php - MySQL 设计说明