如何在mySQL语句中完成来自第三个内部联接的结果

如何在mySQL语句中完成来自第三个内部联接的结果,mysql,Mysql,我使用MySQL数据库 我今天提出这个问题 SELECT t1.catalogID, t2.antfrp, t1.Latin, t1.Popular FROM `mydb`.`products` T1 INNER JOIN `mydb`.`packages` T2 ON T1.catalogID = T2.catalogID WHERE T1.Spring = 1 AND T1.lager + T1.sold > 0 AND (T2.packtyp = "L" OR T2.packtyp

我使用MySQL数据库

我今天提出这个问题

SELECT t1.catalogID, t2.antfrp, t1.Latin, t1.Popular
FROM `mydb`.`products` T1
INNER JOIN `mydb`.`packages` T2 ON T1.catalogID = T2.catalogID
WHERE T1.Spring = 1
AND T1.lager + T1.sold > 0
AND (T2.packtyp = "L" OR T2.packtyp = "P")
它产生了数千行长的记录集。在同一个记录集中,我希望第三个表中的这个问题作为额外字段包含在每一行中

SELECT SUM(Numitems)
from oitems
WHERE
    catalogid = (the actual one for each row) AND
    orderid > 25746 AND (packtyp = "L" OR packtyp = "P") AND
    numitems = 1
为了这个目的做了第三个像这样的内部连接

INNER JOIN `mydb`.`oitems` T3
    ON T3.catalogid = T2.catalogID
并将我的选择更改为

SELECT t1.catalogID, t2.antfrp, t1.Latin, t1.Popular, (SELECT SUM(T3.Numitems)
from oitems AS T3
WHERE T3.orderid > 25746 AND
    (T3.packtyp = "L" OR T3.packtyp = "P") AND T3.numitems = 1)

但是-这不是正确的方法-我感到很受挫,无法思考如何实现这一点-对MySQL有更好理解的人是否可以看到我的错误所在???

您应该加入并使用聚合函数,您应该使用group by for
t1.catalogID,t2.antfrp,t1.Latin,t1.流行的

SELECT SUM(T3.Numitems) , t1.catalogID, t2.antfrp, t1.Latin, t1.Popular
FROM `mydb`.`products` T1
INNER JOIN `mydb`.`packages` T2 ON T1.catalogID = T2.catalogID
INNER JOIN oitems T3 ON T3.catalogid = T1.catalogid 
WHERE T1.Spring = 1
AND T1.lager + T1.sold > 0
AND (T2.packtyp = "L" OR T2.packtyp = "P")
AND T3. orderid > 25746 AND (T3.packtyp = "L" OR T3.packtyp = "P") AND T3.numitems = 1
GROUP BY t1.catalogID, t2.antfrp, t1.Latin, t1.Popular

您可能希望连接到第三个表上的子查询:

SELECT
    t1.catalogID,
    t2.antfrp,
    t1.Latin,
    t1.Popular,
    t3.numitems
FROM products t1
INNER JOIN packages t2
    ON t1.catalogID = t2.catalogID
INNER JOIN
(
    SELECT catalogID, SUM(Numitems) AS Numitems
    FROM oitems
    WHERE
        orderid > 25746 AND
        (packtyp = 'L' OR T3.packtyp = 'P') AND
        numitems = 1
    GROUP BY catalogID
) t3
    ON t2.catalogID = t3.catalogID
WHERE
    t1.Spring = 1 AND
    t1.lager + t1.sold > 0 AND
    (t2.packtyp = 'L' OR t2.packtyp = 'P');

完美工作的解决方案-谢谢-但是我选择使用斯凯西奇的解决方案,因为它更容易放入第四个内部连接(对我来说)@knolen检查两种方法的性能。我相信这种方法通常会表现得更好。我不认为在这种情况下,性能是非常重要的,但可能只是不知道??无论如何,我应该如何检查性能?运行两个查询,看看哪一个需要更长的时间?如果您处理的是小数据集,那么它没有多大区别。两者都在~0,2秒的时间内运行,另一种解决方案有一种稍微快速的趋势-工作起来很有魅力,现在在我们的产品标签生产线中使用。对我来说,加入第四个内部连接也很容易,使用jet的另一个WHERE-子句来自jet的另一个表-谢谢scaisEdge