假设我有两个表a和b;列id在表a中是唯一的,但在表b中有多个条目,列x以及该表中的其他列具有不同的值。表b的主键是(id,x)。
我需要能够将b中的单行加入到 SELECT 查询中,就像我可以使用 MAX 一样:
SELECT * FROM a
INNER JOIN b USING(id)
WHERE b.x = (SELECT MAX(x) FROM b WHERE b.id = a.id)
使用 MAX,这没有问题。但我不需要MAX。我实际上需要这样的东西:
SELECT * FROM a
INNER JOIN b USING(id)
WHERE b.x = (SELECT x FROM b
WHERE x IN (2,3,7) OR x IS NULL
ORDER BY FIELD(x,3,2,7) DESC
LIMIT 1)
此查询失败,因为我的 MySQL 版本不支持此子查询中的 LIMIT。是否有另一种方法可以确保按照我提供的顺序至少并准确地加入一行?
我正在尝试做的示意图概述将是:
Select * from table a for each id
Join table b where x = 7
If no entry in b exists where a.id=b.id and x = 7, join b where x = 2
If no entry in b exists where a.id=b.id and x IN (2,7), join b where x = 3
If no entry in b exists where a.id=b.id and x IN (2,3,7), join b where x IS NULL
我有这个需求是因为:
- 在我需要的这段特定代码中,我不能使用多个查询;它必须是一个神奇的多合一查询
- 我不能使用 INNER JOIN (SELECT * ) 语句
- 我不能有任何 id 出现多次的查询(因此 DISTINCT 不是选项,因为表 b 中的值可能不同)
- 我确定表 b 有一个 a.id 条目,其中 x 是 2、3、7 或 NULL,但我不知道是哪个,我也不知道 a.id 中有多少条目表 b。
- 升级 MySQL 不是最佳选择,因为此代码必须在我的任何客户的通用服务器上运行
所以,简而言之,我的问题是:是否有类似于 MAX 的函数可以考虑特定顺序而不是 MAX 值?
提前致谢!