簡體   English   中英

在聯接表中獲取沒有匹配記錄的記錄

[英]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)

使用JOINIS 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM