該查詢應該給你,你需要的結果:
SELECT
MIN(ID),
EMail,
MIN(Priority1),
MIN(Priority2),
MIN(Priority3)
FROM
yourtable
WHERE
(EMail, Priority1, Priority2, FIELD(Priority3, 'High', 'Medium', 'Low')) IN (
SELECT
EMail,
MIN(Priority1),
MIN(Priority2),
MIN(FIELD(Priority3, 'High', 'Medium', 'Low')) MinP3
FROM
yourtable
WHERE
(EMail, Priority1, FIELD(Priority2, 'Four', 'Three', 'Two', 'One')) IN (
SELECT
EMail,
MIN(Priority1),
MIN(FIELD(Priority2, 'Four', 'Three', 'Two', 'One')) MinP2
FROM
yourtable
WHERE
(EMail, FIELD(Priority1, 'Peach', 'Banana', 'Apple')) IN
(SELECT
EMail, MIN(FIELD(Priority1, 'Peach', 'Banana', 'Apple')) MinP1
FROM
yourtable
GROUP BY
EMail)
GROUP BY
EMail)
GROUP BY
EMail)
GROUP BY
EMail
(我返回第3行而不是2,但如果我正確理解你的問題,它應該是正確的)。請參閱小提琴here。我懷疑它不會很快。我仍然想知道是否有辦法讓它更快。
編輯
您可以嘗試以下查詢。它使用了一種不同的邏輯,但它也使用帶有某些列的Priorities表,它們應該比FIELD函數快得多,但是有很多連接可能會減慢查詢的速度。
CREATE TABLE Priorities (
Num INT,
Des VARCHAR(10),
Priority INT,
PRIMARY KEY (Num, Des)
);
INSERT INTO Priorities VALUES
(1, 'Peach', 1),
(1, 'Banana', 2),
(1, 'Apple', 3),
(2, 'Four', 1),
(2, 'Three', 2),
(2, 'Two', 3),
(2, 'One', 4),
(3, 'High', 1),
(3, 'Medium', 2),
(3, 'Low', 3);
SELECT MIN(ID), yourtable.Email, MIN(Priority1) Priority1, MIN(Priority2) Priority2, MIN(Priority3) Priority3
FROM
yourtable
INNER JOIN Priorities p1 ON yourtable.Priority1=p1.Des AND p1.Num=1
INNER JOIN Priorities p2 ON yourtable.Priority2=p2.Des AND p2.Num=2
INNER JOIN Priorities p3 ON yourtable.Priority3=p3.Des AND p3.Num=3
INNER JOIN (
SELECT s1.EMail, MIN(MinP1) M1, MIN(MinP2) M2, MIN(MinP3) M3
FROM (
SELECT EMail, MIN(p1.Priority) MinP1
FROM yourtable INNER JOIN Priorities p1
ON yourtable.Priority1 = p1.Des AND p1.Num = 1
GROUP BY EMail) s1
INNER JOIN (
SELECT EMail, p1.Priority Pr1, MIN(p2.Priority) MinP2
FROM yourtable INNER JOIN Priorities p1
ON yourtable.Priority1 = p1.Des AND p1.Num = 1
INNER JOIN Priorities p2
ON yourtable.Priority2 = p2.Des AND p2.Num = 2
GROUP BY EMail, p1.Priority) s2
ON s1.EMail=s2.EMail AND s1.MinP1=s2.Pr1
INNER JOIN (
SELECT EMail, p1.Priority Pr1, p2.Priority Pr2, MIN(p3.Priority) MinP3
FROM yourtable INNER JOIN Priorities p1
ON yourtable.Priority1 = p1.Des AND p1.Num = 1
INNER JOIN Priorities p2
ON yourtable.Priority2 = p2.Des AND p2.Num = 2
INNER JOIN Priorities p3
ON yourtable.Priority3 = p3.Des AND p3.Num = 3
GROUP BY EMail, p1.Priority, p2.Priority) s3
ON s1.Email=s3.Email AND s1.MinP1=s3.Pr1 AND s2.MinP2=s3.Pr2
GROUP BY
s1.EMail) s
ON yourtable.EMail=s.Email
AND p1.Priority=s.M1
AND p2.Priority=s.M2
AND p3.Priority=s.M3
GROUP BY
yourtable.EMail
請參閱小提琴here。如果它仍然太慢,我們可以嘗試使用我的第一個查詢與第二個支持表一樣。或者我們應該將查詢分爲兩部分。
爲什麼記錄2,具有中等優先級,而不是3或4? – fthiella 2013-05-10 19:23:34
正常化任何人? – Strawberry 2013-05-13 22:49:08