[英]Getting records with no matching records in joined table
我有下面的2個表MySQL數據庫。
CREATE TABLE `leads` (
`lead_id` int(11) NOT NULL,
`fname` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
`lname` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
`email` varchar(200) CHARACTER SET utf8 DEFAULT NULL,
`phone_mobile` varchar(15) CHARACTER SET utf8 DEFAULT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `leads`
ADD PRIMARY KEY (`lead_id`);
ALTER TABLE `leads`
MODIFY `lead_id` int(11) NOT NULL AUTO_INCREMENT;
CREATE TABLE `card_results` (
`card_result_id` int(11) NOT NULL,
`lead_id` int(11) NOT NULL,
`success` tinyint(1) NOT NULL DEFAULT '0',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `card_results`
ADD PRIMARY KEY (`card_result_id`),
ADD KEY `created` (`created`),
ADD KEY `success` (`success`);
ALTER TABLE `card_results`
MODIFY `card_result_id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `card_results`
ADD CONSTRAINT `FK_card_results_lead_id` FOREIGN KEY (`lead_id`) REFERENCES `leads` (`lead_id`) ON DELETE CASCADE ON UPDATE CASCADE,
COMMIT;
我希望能夠找到的所有記錄leads
表,其中有在沒有匹配記錄card_results
表在過去的3個月。
這兩個表由外鍵“ lead_id”關聯
我的查詢如下:
SELECT l.lead_id
FROM leads l
WHERE
(SELECT COUNT(*)
FROM card_results c
WHERE success = 1
AND created >= NOW()-INTERVAL 3 MONTH
AND c.lead_id = l.lead_id) = 0
查詢運行有點慢,我想對其進行優化。
還有另一種方法可以達到相同的結果。
您可以將LEFT
join與IS NULL
以確保您的過濾器應在ON
子句中使用,而不是WHERE
SELECT l.lead_id
FROM leads l
LEFT JOIN card_results c
ON l.lead_id = c.lead_id
AND c.created >= NOW()-INTERVAL 3 MONTH
AND c.success = 1
WHERE c.lead_id IS NULL
通過以下方式之一嘗試:
使用NOT IN
SELECT l.lead_id
FROM leads l
WHERE l.lead_id NOT IN (
SELECT c.lead_id
FROM card_results c
WHERE success = 1
AND created >= NOW()-INTERVAL 3 MONTH)
使用JOIN
和IS NULL
SELECT l.lead_id
FROM leads l
LEFT JOIN card_results c ON c.lead_id = l.lead_id
AND c.success = 1
AND created >= NOW()-INTERVAL 3 MONTH
WHERE c.lead_id IS NULL
使用NOT EXISTS
SELECT l.lead_id
FROM leads l
WHERE NOT EXISTS
(SELECT 1
FROM card_results c
WHERE success = 1
AND created >= NOW()-INTERVAL 3 MONTH
AND c.lead_id = l.lead_id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.