Mysql 嵌套联接有问题

Mysql 嵌套联接有问题,mysql,sql,Mysql,Sql,因此,我试图结合一些查询,我遇到了一个问题: SELECT OFFERS.ID AS ID, OFFERS.NAME as NAME, PROGRAM_ID, OFFER_TYPE, DATE_CREATED, PROGRAMS.NAME as PROGRAM_NAME, CLICKS_IN, CLICKS_OUT, SALES FROM (OFFERS INNER JOIN PROGRAMS ON PROGRAMS.ID = OFFERS.PROGRAM_ID)

因此,我试图结合一些查询,我遇到了一个问题:

SELECT OFFERS.ID AS ID, OFFERS.NAME as NAME, PROGRAM_ID, OFFER_TYPE, DATE_CREATED, PROGRAMS.NAME as PROGRAM_NAME, CLICKS_IN, CLICKS_OUT, SALES 
FROM 
    (OFFERS INNER JOIN PROGRAMS ON PROGRAMS.ID = OFFERS.PROGRAM_ID) 
        INNER JOIN 
    (SELECT COUNT(*) AS CLICKS_IN FROM CLICKS_IN WHERE OFFER = ID)a 
        INNER JOIN 
    (SELECT COUNT(*) AS CLICKS_OUT FROM CLICKS_OUT WHERE OFFER = ID)b
        INNER JOIN 
    (SELECT SUM(REVENUE) AS SALES FROM CONVERSIONS WHERE LOCAL_OFFER = ID)c
WHERE OFFER_ACTIVE = 1 AND OFFERS.USER_GROUP = ?

我希望OFFER=ID查询使用OFFERS.ID中的值作为ID,但我不知道如何让它实现这一点。

我认为您的初始括号有点混淆,您使用的选择类型更适合于选择表达式列表中的子查询;试着这样做:

SELECT OFFERS.ID AS ID, OFFERS.NAME as NAME, PROGRAM_ID, OFFER_TYPE
   , DATE_CREATED, PROGRAMS.NAME as PROGRAM_NAME, CLICKS_IN, CLICKS_OUT, SALES 
FROM OFFERS 
   INNER JOIN PROGRAMS ON PROGRAMS.ID = OFFERS.PROGRAM_ID 
   INNER JOIN 
    (SELECT OFFER, COUNT(*) AS CLICKS_IN FROM CLICKS_IN GROUP BY OFFER) AS a 
    ON a.OFFER = OFFERS.ID
   INNER JOIN 
    (SELECT OFFER, COUNT(*) AS CLICKS_OUT FROM CLICKS_OUT GROUP BY OFFER) AS b 
    ON b.OFFER = OFFERS.ID
   INNER JOIN 
    (SELECT LOCAL_OFFER, SUM(REVENUE) AS SALES FROM CONVERSIONS GROUP BY LOCAL_OFFER) AS c
    ON c.LOCAL_OFFER = OFFERS.ID
WHERE OFFER_ACTIVE = 1 AND OFFERS.USER_GROUP = ?
与引用外部查询的相关子查询相比,这种方法的效率更高,除非子查询中涉及的表非常庞大,并且/或者最终的结果非常少。在这种情况下,原始子查询可以按原样移动到SELECT子句:

SELECT o.ID AS ID, o.NAME as NAME, PROGRAM_ID, OFFER_TYPE, DATE_CREATED, PROGRAMS.NAME as PROGRAM_NAME
   , (SELECT COUNT(*) FROM CLICKS_IN AS t WHERE t.OFFER = o.ID) AS CLICKS_IN
   , (SELECT COUNT(*) FROM CLICKS_OUT AS t WHERE t.OFFER = o.ID) AS CLICKS_OUT
   , (SELECT SUM(REVENUE) FROM CONVERSIONS AS t WHERE t.LOCAL_OFFER = o.ID) AS SALES 
FROM OFFERS AS o INNER JOIN PROGRAMS ON PROGRAMS.ID = o.PROGRAM_ID 
WHERE OFFER_ACTIVE = 1 AND o.USER_GROUP = ?

旁注:在涉及多个表的查询中,最好完全限定所使用的任何字段名。例如,我无法确定这些字段的来源:PROGRAM\u ID、OFFER\u TYPE、DATE\u CREATED、OFFER\u ACTIVE。

很不清楚您在这里想做什么。加入计数查询?没有任何条件的联接?看起来更像那些COUNT*应该在您的SELECT子句中,比如COUNTCLICKS\u in.ID,其中包含到CLICKS\u in、CLICKS\u OUT、etccclicks\u in、CLICKS\u OUT和conversion的联接,它们都是单独的表,以OFFERS.ID作为潜在索引。我正在尝试获取链接到用户组中所有活动优惠的所有点击和销售数据。请参阅“谢谢”的可能副本,这非常有帮助第一种方法是我开始使用的,但如果没有点击、点击和销售,则会丢失,这正是我尝试解决的问题。不管怎样,第二种方法对我来说是有效的,因为有大量的非活动的报价,我不想收集这些报价的数据;当我写答案时,我真的想提一些东西,但我觉得这太过分了。哇,谢谢!我还在学习连接是如何工作的,所以你的答案非常有用。