我继承了一个需要照看的网站,并且在网站上运行作业时,sql查询出现了问题。
不幸的是,我是一名前端开发人员,虽然我对简单的SQL很好,但这对我来说太复杂了。问题似乎出现在第二个EXISTS及其与主查询的连接中。
这是代码,它应该收集要发送给公司的项目ID列表。
此查询有什么明显错误吗?
SELECT mc.id AS company_id,
mi.id AS item_id,
EXISTS (
SELECT 1
FROM mysite AS m2
JOIN mysite_order AS mo2
ON m2.mysite_order_id = mo2.id
WHERE mo2.mysite_item_id = mo.mysite_item_id
AND m2.company_email_sent = 'Yes'
) AS email_sent_before,
m.id AS mysite_id,
m.mysite_code_prefix,
m.mysite_code_suffix
FROM mysite_company AS mc
JOIN mysite_item AS mi
ON mc.id = mi.company_id
JOIN mysite_order AS mo
ON mi.id = mo.mysite_item_id
JOIN mysite AS m
ON mo.id = m.mysite_order_id
WHERE mi.avail_end_date <= CURDATE()
AND EXISTS (
SELECT 1
FROM mysite AS m3
JOIN mysite_order AS mo3
ON m3.mysite_order_id = mo3.id
WHERE mo3.mysite_item_id = mo.mysite_item_id
AND m3.company_email_sent = 'No' )
ORDER BY company_id ASC, item_id ASC, m.mysite_code_prefix ASC,
m.mysite_code_suffix ASC
LIMIT 1
答案 0 :(得分:0)
如何使用这样的内联子查询:
...
( SELECT m2.company_email_sent, COUNT(m2.company_email_sent)
FROM mysite AS m2
JOIN mysite_order AS mo2
ON m2.mysite_order_id = mo2.id
WHERE mo2.mysite_item_id = mo.mysite_item_id
AND m2.company_email_sent IN ( 'Yes', 'No' )
GROUP BY m2.company_email_sent ) email_status
...
然后,您可以加入到该内联子查询,并查找COUNT是否为0,作为执行这两个单独的EXISTS子查询的替代方法。
另外 - 我在这里对业务逻辑做出假设 - 你不期望在子查询中加入mysite_company
吗?即,您是否关注有关该项目的电子邮件是否已发送给正在下订单的客户?目前,子查询中没有任何内容与外部查询中的mysite_customer
相关。
答案 1 :(得分:0)
最大的问题是第二个exists()
。
根据您要查找的内容,可以将其替换为mo.company_email_sent = 'No'
或加入声明。
更理想的是,您希望将exists()
语句的值存储在索引字段中。可以使用触发器或使用应用级代码进行设置。