Hej伙计,
我必须处理一个特殊问题。首先,这是简化表:
id | A | B
-------------
1 | a | 1
2 | b | 2
3 | c | 1
4 | d | 1
5 | e | 3
6 | f | 1
7 | g | 2
感谢一个非常蹩脚的API,我得到了一个必需的ID列表,如
(1,2,3,5,6)
但是,在此列表中,我必须仅选择列B中具有特定未知值的行。在此示例中,未知值将为1,因为第一个匹配的id具有1 in B栏。
结果我需要行
1, 3, 4, 6
因为 required 第2行和第6行在B列中具有不同的值。
我希望你能跟进到目前为止。
问题已经通过过滤软件内部的结果解决了,但我想知道是否有纯SQL的解决方案?
数据库是MySQL,我没有机会更改表或API,因为这是现有软件的插件:(
提前致谢!我想这是不可能的,但事实上我的SQL技能并不是最好的。
P.S。
如果请求的ID是这样的:
(2,3,5,6,7)
结果必须是:
(2, 7)
因为列B的第一个读取值是“2”
答案 0 :(得分:2)
试试这个:
SELECT * FROM Table WHERE id IN (1,2,3,4,5) AND ColB = (SELECT ColB FROM Table WHERE id IN (1,2,3,4,5) ORDER BY id ASC LIMIT 1)
在内部查询(括号内的一个)中,我保留了整个序列的完整性,因为我假设这是由服务器端脚本(如PHP)插入的。这样,您就可以重复使用相同的变量。
我没有意识到ID可以是随机顺序(即3,2,7,1然后3将是该列表的权威,而不是1)。
请参阅此新问题以解决此问题:
SELECT * FROM Table WHERE id IN (1,2,3,4,5) AND ColB = (SELECT ColB FROM Table WHERE id IN (1,2,3,4,5) ORDER BY FIELD(id,1,2,3,4,5) LIMIT 1)
答案 1 :(得分:1)
您可以通过自我加入解决问题。
在列B的值上自动加入表格。从中选择ID在您请求中的所有位置。
答案 2 :(得分:0)
您可以使用子查询使用LEAST函数返回第一个(最低)ID的值:
SELECT
*
FROM
yourtable
WHERE
B = (SELECT B FROM yourtable WHERE ID = LEAST(1,2,3,5,6));
请参阅小提琴here。您可能还想添加条件:
WHERE
ID IN (1,2,3,5,6)
AND
B = (SELECT B FROM yourtable WHERE ID = LEAST(1,2,3,5,6));