在這個例子中,我有一個用戶(main_data),通過列表(pass_list)和每個通行碼類型(pass_code)的相應優先級列表。我正在構建的查詢正在查找用戶列表以及具有最低優先級的相應密碼類型。下面的查詢的作品,但它似乎有可能是一個更快的方式來構建它我缺少。 SQL小提琴:http://sqlfiddle.com/#!2/2ec8d/2/0或參見下面的表格詳細信息。最快的方式來選擇加入最小行
SELECT md.first_name, md.last_name, pl.*
FROM main_data md
JOIN pass_list pl on pl.main_data_id = md.id
AND
pl.id =
(
SELECT pl2.id
FROM pass_list pl2
JOIN pass_code pc2 on pl2.pass_code_type = pc2.type
WHERE pl2.main_data_id = md.id
ORDER BY pc2.priority
LIMIT 1
)
結果:
+------------+-----------+----+--------------+----------------+
| first_name | last_name | id | main_data_id | pass_code_type |
+------------+-----------+----+--------------+----------------+
| Bob | Smith | 1 | 1 | S |
| Mary | Vance | 8 | 2 | M |
| Margret | Cough | 5 | 3 | H |
| Mark | Johnson | 9 | 4 | H |
| Tim | Allen | 13 | 5 | M |
+------------+-----------+----+--------------+----------------+
用戶(main_data)
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1 | Bob | Smith |
| 2 | Mary | Vance |
| 3 | Margret | Cough |
| 4 | Mark | Johnson |
| 5 | Tim | Allen |
+----+------------+-----------+
通列表(pass_list)
+----+--------------+----------------+
| id | main_data_id | pass_code_type |
+----+--------------+----------------+
| 1 | 1 | S |
| 3 | 2 | E |
| 4 | 2 | H |
| 5 | 3 | H |
| 7 | 4 | E |
| 8 | 2 | M |
| 9 | 4 | H |
| 10 | 4 | H |
| 11 | 5 | S |
| 12 | 3 | S |
| 13 | 5 | M |
| 14 | 1 | E |
+----+--------------+----------------+
表指定的優先級(pass_code)
+----+------+----------+
| id | type | priority |
+----+------+----------+
| 1 | M | 1 |
| 2 | H | 2 |
| 3 | S | 3 |
| 4 | E | 4 |
+----+------+----------+
雖然它通常能夠正常工作,但它帶回的行的值是官方未定義的。所以將來它可能不是第一排。 – Kickstart
@Kickstart是的......人們總是這麼說,但它的工作時間如此多年,如果它發生變化,那麼我會擔心這一點。在此之前,我個人認爲利用這個令人難以置信的方便「功能」是很好的。 – Bohemian
公平點,但如果它確實發生了變化,我認爲它是一個噩夢,以查找哪些查詢有什麼問題。 – Kickstart