繁体   English   中英

在LEFT JOIN中传递参数

[英]Passing argument in LEFT JOIN

我目前正在尝试使用具有未知值的LEFT JOIN从2个表中获取数据。

我尝试使用LEFT JOIN,但是没有用。

这是我的代码示例:

SELECT 
    cc.shid,
    cc.user,
    ts.type,
    sum(cc.qty1) + sum(cc.qty2) as qty_tot,
    COUNT(cc.id) as nb
FROM
    content_c cc
LEFT JOIN
    (SELECT
        s.shid,
        s.type
    FROM
        tab_s s
    LIMIT 1
    ) as ts ON ts.shid = cc.shid
WHERE 
    cc.time_i like '2019-01%'
GROUP BY 
    cc.user,
    ts.type

使用该查询将永远无法工作:无论cc.shid如何,ts都将包含tab_s的首次出现。 我想知道是否有办法做到这一点:

LEFT JOIN
    (SELECT
        s.shid,
        s.type
    FROM
        tab_s s
    WHERE
        s.shid = cc.shid
    LIMIT 1
    ) as ts ON ts.shid = cc.shid

任何想法 ? 在SQL或类似的东西中有指针概念吗? 就像我可以使用&cc.shid或@ cc.shid吗?

请注意,请执行以下操作:

LEFT JOIN tab_s ts ON ts.shid = cc.shid

我的请求将花费1分钟以上的时间才能显示结果。 而且我无法在tab_s.shid和cc.shid中设置索引,因为它多次出现。

请记住,content_c可以多次出现cc.shid,这就是为什么我只需要获取第一个结果(LIMIT 1)的原因。 这一点很重要。

使用相关子查询:

SELECT cc.shid, cc.user, cc.type,
       SUM(cc.qty1) + SUM(cc.qty2) as qty_tot,
       COUNT(cc.id) as nb
FROM (SELECT cc.*,
             (SELECT s.type
              FROM tab_s s
              WHERE ts.shid = cc.shid
              LIMIT 1 
             ) as type
      FROM content_c cc
     ) cc
WHERE cc.time_i >= '2019-01-01' AND
      cc.time_i < '2019-02-01'
GROUP BY cc.shid, cc.user, cc.type;

笔记:

  • 在没有ORDER BY的情况下使用LIMIT是可疑的。 为什么基础表中会有重复项?
  • 您的日期比较不正确。 使用日期/时间值时,请使用日期/时间功能。 不要使用字符串函数。
  • GROUP BY应该在SELECT包括所有未聚合的列。

正如问题注释中所讨论的,您可以尝试使用此脚本,看看它是否满足您的要求? 这将对“ content_c”表中的每个ID返回一行,并具有GROUP BY影响。

SELECT 
    cc.shid,
    cc.user,
    ts.type,
    sum(cc.qty1) + sum(cc.qty2) as qty_tot,
    COUNT(cc.id) as nb
FROM content_c cc
LEFT JOIN
(
    SELECT DISTINCT s.shid, s.type FROM tab_s s
) AS ts ON ts.shid = cc.shid
WHERE cc.time_i like '2019-01%'
GROUP BY cc.shid,cc.user,ts.type

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM