我不認爲臨時表是必要的。如果我們無法獲得可接受的表現,我們只會走這條路。
從您的查詢,我們收集您的模式是這樣的:
group (id INT PK, gid INT, mid INT)
items (id INT PK, item_id INT, mid INT)
members (id INT PK, email VARCHAR)
它看起來像你的group
表是一個真正的「會員」表,解決/實現之間的許多一對多的關係組和一個人。 (也就是說,一個人可以是零個,一個或多個組的成員;一個組可以有零個或多個人作爲成員。)
您在使用group
和members
之間的左連接。當沒有匹配的成員時,這將返回一個組(返回group.id)的行,members.email爲NULL(這可能是你想要的)。但是,如果您只想返回電子郵件地址,則可以將其更改爲INNER JOIN。
NOT EXISTS謂詞可以用OUTER JOIN和從JOINED表返回的NULL值的測試替換。如果group.gid
和/或items.item_id
列是數字數據類型,則可以從謂詞中的整數文字中刪除引號。
這裏是將返回的等效結果集的替代形式,可以更好地執行:
SELECT m.email
, g.id
FROM members m
JOIN group g ON g.mid = m.id AND g.gid = 1
LEFT
JOIN items i ON i.mid = m.id AND i.item_id = 5
WHERE i.id IS NULL
附錄:
TEST CASE(在選擇的回答評論提供)顯示在結果差在ON
子句和WHERE
子句中的謂詞items.item_id = 5
之間設置。 (把這個謂詞移動到WHERE子句用反連接混淆。)
CREATE TABLE `group` (`id` INT PRIMARY KEY, `gid` INT, `mid` INT);
CREATE TABLE `items` (`id` INT PRIMARY KEY, `item_id` INT, `mid` INT);
CREATE TABLE `members` (`id` INT PRIMARY KEY, `email` VARCHAR(40));
INSERT INTO `group` VALUES (1,1,1), (2,1,2);
INSERT INTO `items` VALUES (1,5,1);
INSERT INTO `members` VALUES (1,'[email protected]'),(2,'[email protected]');
@Amit Bhargava - no as mine is three tables with a join。 – timeout
如果你只想要來自一個組的成員,爲什麼你有'LEFT JOIN'? –
@ypercube - 是的,這是正確的,但我也想從組中的身份證。 ty – timeout