我有一个我想要了解的查询。有人可以了解这个查询的详细信息吗?
我只在连接条件中使用过一个ON
子句。这个有LEFT JOIN
的多个条件,这使得理解起来很棘手。
INSERT INTO nop_tbl
(q_date, community_id, newsletter_t, subscription_count)
SELECT date(now()), a.community_id,
a.newsletter_type,
count(a.subscriber_user_id)
FROM
newsletter_subscribers_main a
LEFT OUTER JOIN nop_tbl b
ON (a.community_id = b.community_id)
AND (a.newsletter_type = b.newsletter_t)
AND (a.created_at = b.q_date)
WHERE b.q_date is null
AND b.mailing_list is null
GROUP BY a.community_id, a.newsletter_t, a.created_at
答案 0 :(得分:2)
你有解释:
查询的目标是计算(q_date, community_id, newsletter_t)
中newsletter_subscribers_main
的订阅次数,并将结果写入nop_tbl
。
LEFT JOIN
可以防止多次添加行。
但我也认为,查询效率低,可能错误。
第二个WHERE
条款:
AND b.mailing_list is null
只是噪音,可以删除。如果b.q_date is null
,则此查询中的b.mailing_list
保证为空。
JOIN
条件周围不需要括号。
如果定义subscriber_user_id
NOT NULL
,则count(*)
会做同样的事情,更便宜。
我怀疑在插入a.created_at
时按date(now())
进行分组可能是错误的。几乎没有任何意义。我的有根据的猜测(假设created_at
的类型为date
):
INSERT INTO nop_tbl
(q_date, community_id, newsletter_t, subscription_count)
SELECT a.created_at
,a.community_id
,a.newsletter_type
,count(*)
FROM newsletter_subscribers_main a
LEFT JOIN nop_tbl b ON a.community_id = b.community_id
AND a.newsletter_type = b.newsletter_t
AND a.created_at = b.q_date
WHERE b.q_date IS NULL
GROUP BY a.created_at, a.community_id, a.newsletter_t;
答案 1 :(得分:1)
简短版本是:
insert ... select ...
nob_tbl
from ...
newsletter_subscribers_main
left join ... where ... is null
nob_tbl
答案 2 :(得分:0)
一步一步
INSERT INTO nop_tbl
(q_date, community_id, newsletter_t, subscription_count)
INSERT
syntax这告诉数据库在哪个表和哪个列将用于插入查询
SELECT date(now()), a.community_id,
a.newsletter_type,
count(a.subscriber_user_id)
而是要插入的selected字段
FROM
newsletter_subscribers_main a
这里告诉数据库从表a.
中选择前缀为newsletter_subscribers_main
的字段
LEFT OUTER JOIN nop_tbl b
此处左侧是另一个表nop_tbl
,其中将选择其他字段
ON (a.community_id = b.community_id)
AND (a.newsletter_type = b.newsletter_t)
AND (a.created_at = b.q_date)
这些是JOIN
的规则,实际上是告诉哪些列将用于连接
WHERE b.q_date is null
AND b.mailing_list is null
那些是WHERE
clauses,它们用于将结果限制为所请求的数据,在这种情况下,两列为空
GROUP BY a.community_id, a.newsletter_t, a.created_at
GROUP BY
clauses,用于对给定列的结果进行分组
您可以对joins here
进行直观说明