在这个例子中,我有一个用户(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