【问题标题】:Mysql LEFT JOIN twice using same parent primary key ON different child tablesMysql LEFT JOIN 两次在不同的子表上使用相同的父主键
【发布时间】:2021-09-24 11:21:28
【问题描述】:

我有 4 张桌子:
T1 {id, user_name, email, telephone, created_at, updated_at}
T2 {id, menu_name, town, district, t1_foreign, view_budget, view_menu, created_at, updated_at}
T3 {id, t2_foreign, menu_item_name, ingredients, calories, cost_ex, cost_in, selling_in, selling_ex, image_dir, img_caption, view_item, created_at, updated_at}
T4 {id, t1_foreign, t2_foreign, created_at, updated_at}

来自T1 的用户链接到T2T2.t1_foreign 上的菜单。最初的想法是,只有作为区域代表的链接用户才能看到表 T3 中菜单项的成本。但这种情况发生了变化,因此创建了表 T4 以将其他用户链接到 T4.t2_foreignT4.t1_foreign 上的 T2,因此他们还可以查看特定菜单的成本。

我正在尝试创建一个摘要查询,以便查看菜单的信息以及链接用户的数量,但我得到重复的聚合 COUNT。我发现这是由于T2 具有相同别名的双重联接,但似乎无法解决这个问题。

SELECT t2.id t2.menu_name, t2.town, t2.district, t2.view_menu, t2.view_budget, 
IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked, // <=== aggregate function
GREATEST(t2.updated_at, t2.created_at, COALESCE(t3.updated_at, \'1000-01-01\'), COALESCE(t3.created_at, \'1000-01-01\')) AS newest
    FROM T2 AS t2
        LEFT JOIN T3 AS t3
            ON (t3.t2_foreign = t2.id)
        INNER JOIN T1 AS t1
            ON (t2.t1_foreign = t1.id)
        LEFT JOIN T4 AS t4
            ON (t4.t2_foreign = t2.id) // this creates duplicate count
    GROUP BY t2.id
    ORDER BY (newest, ASC)

我已经尝试过子查询连接

SELECT t2.id t2.menu_name, t2.town, t2.district, t2.view_menu, t2.view_budget, 
tt.linked, 
GREATEST(t2.updated_at, t2.created_at, COALESCE(t3.updated_at, \'1000-01-01\'), COALESCE(t3.created_at, \'1000-01-01\')) AS newest
    FROM T2 AS t2
        LEFT JOIN T3 AS t3
            ON (t3.t2_foreign = t2.id)
        INNER JOIN T1 AS t1
            ON (t2.t1_foreign = t1.id)
        LEFT JOIN (
            SELECT IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked
                FROM T4
            ) AS t4 ON (t4.t2_foreign = t2.id) // this give not unique table/alias error
    GROUP BY t2.id
    ORDER BY (newest, ASC)

有人可以为我指出正确的方向以获得正确的汇总 COUNT 结果吗?

更新:结果虽然不是预期的
在摆弄了我的子查询工作之后,我得到了它来返回一个结果,但结果是所有记录的聚合,而不是每条记录的聚合。不得不将其更改为:

        LEFT JOIN (
            SELECT IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked, t4.t2_foreign
                FROM T4 as t4
            ) AS tt ON (tt.t2_foreign = t2.id)

虽然在正确的轨道上。

【问题讨论】:

  • 聚合而不是连接或使用相关子查询。
  • 如何先聚合再加入?
  • 当然是在子查询中聚合。

标签: mysql count left-join inner-join aggregate-functions


【解决方案1】:

最后不需要加入,我使用相关子查询作为子SELECT,如 cmets 中所建议的那样。子查询:

( SELECT IF(COUNT(t4.t2_foreign)=0, "1", CONCAT("1+", COUNT(t4.t2_foreign), " Others")) AS linked
    FROM T4 as t4
    WHERE t4.t2_foreign=t2.id
    ) AS linked

这为 T2 中的每个主键检索了表 T4 到表 T2 中链接用户数的聚合 COUNT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-05-02
    • 2017-11-27
    相关资源
    最近更新 更多