【问题标题】:Filtering a part of data in mysql joint table过滤mysql连接表中的部分数据
【发布时间】:2015-05-26 04:32:53
【问题描述】:

这是我拥有的初始 mysql 代码,它显示了我需要什么:

    SELECT (
    CASE 
       WHEN (c.`norm_id` = 71) THEN 71
       ELSE c.parent_id
    END) AS parent, 
    SUM(d.number) AS parent_sum,
    COUNT(DISTINCT(c.norm_id)) AS child_cnt
FROM un_catalog AS c
    LEFT JOIN un_data AS d ON (c.norm_id =  d.type2_norm_id)
    LEFT JOIN exp_weblog_titles AS wt USING (entry_id)
WHERE (c.parent_id != '') AND (c.`type_id` = 2) OR (c.norm_id = 71) 
GROUP BY parent
ORDER BY parent ASC;

现在我添加一个过滤器:

 SELECT (
    CASE 
       WHEN (c.`norm_id` = 71) THEN 71
       ELSE c.parent_id
    END) AS parent, 
    SUM(d.number) AS parent_sum,
    COUNT(DISTINCT(c.norm_id)) AS child_cnt
FROM un_catalog AS c
    LEFT JOIN un_data AS d ON (c.norm_id =  d.type2_norm_id)
    LEFT JOIN exp_weblog_titles AS wt USING (entry_id)
WHERE (c.parent_id != '') AND (wt.year = 2014) AND (c.`type_id` = 2) OR (c.norm_id = 71) 
GROUP BY parent
ORDER BY parent ASC;

我需要过滤第二个表(第 2 列)中的数据,同时保持结构(第 1 列和第 3 列)而不进行过滤。我该怎么做?

【问题讨论】:

    标签: mysql sql filtering


    【解决方案1】:

    outer join时,不要将outer table条件放在WHERE子句中,然后放在ON子句中。 (否则外连接作为常规内连接工作......)

     SELECT (
        CASE 
           WHEN (c.`norm_id` = 71) THEN 71
           ELSE c.parent_id
        END) AS parent, 
        SUM(d.number) AS parent_sum,
        COUNT(DISTINCT(c.norm_id)) AS child_cnt
    FROM un_catalog AS c
        LEFT JOIN un_data AS d ON (c.norm_id = d.type2_norm_id)
        LEFT JOIN exp_weblog_titles AS wt ON wt.entry_id = XXX.entry_id AND (wt.year = 2014)
    WHERE (c.parent_id != '')  AND (c.`type_id` = 2) OR (c.norm_id = 71) 
    GROUP BY parent
    ORDER BY parent ASC;
    

    注意,我不知道entry_id属于哪个表,所以将上面的XXX替换为c或d! (USING...)

    【讨论】:

    • 非常感谢,它有效!从来不知道我们可以在“ON”中使用过滤器。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多