Mysql 选择*其中(..)中的id和所有列相等

Mysql 选择*其中(..)中的id和所有列相等,mysql,Mysql,嘿,伙计们 我必须处理一个特殊的问题。首先,这是简化表: 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在B列中具有1 因此,我需要这些

嘿,伙计们

我必须处理一个特殊的问题。首先,这是简化表:

 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在B列中具有1

因此,我需要这些行

1, 3, 4, 6
因为所需的第2行和第6行在B列中的值不同

我希望你能做到这一点

通过在软件内部过滤结果,问题已经解决了,但我想知道是否有纯SQL的解决方案

DB是MySQL,我没有机会更改表或API,因为这是现有软件的插件:

提前谢谢!我想这是不可能的,但说实话,我的SQL技能并不是最好的

附言

如果请求的ID为:

 (2,3,5,6,7)
结果必须是:

(2, 7)

因为列B的第一个获取值是2,所以可以通过自联接来解决问题

在B列的值上根据表自身加入表。从中选择ID在请求中的所有位置。

尝试以下操作:

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)
在括号内的内部查询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)

您可以使用一个子查询,该子查询使用最小函数返回第一个最低ID的值:

SELECT
  *
FROM
  yourtable
WHERE
  B = (SELECT B FROM yourtable WHERE ID = LEAST(1,2,3,5,6));
请看小提琴。您可能还需要添加以下条件:

WHERE
  ID IN (1,2,3,5,6)
  AND
  B = (SELECT B FROM yourtable WHERE ID = LEAST(1,2,3,5,6));

所以为了澄清,你得到了一个你需要返回的id列表。然后,B列中的值让我们为该id的第一个匹配调用该值X,该值在逻辑上是列表中提供的id值中的最低值,将用作第二个约束,然后返回的所有行也必须是B=X?是的:这就是问题所在,id在。。。B=从id=1的表格中选择B?是的,这是可能的。但是如何在不操纵软件中的id列表的情况下确定子查询id呢?我用它进行了测试,但在软件中选择所有行并删除不必要的行似乎要快一点。在大多数情况下,我们谈论的是2~3排长龙,这是最好、最快的解决方案!我假设子查询在找到B的值后立即停止?该死的,我想念我的DB guy:是的,LIMIT 1子句应该使它在命中第一个匹配项后停止搜索。@JustinIurman,这是不正确的,因为查询需要受两个约束的限制。您的查询将返回所有将列B设置为第一行值的id,而不管原始列表中提供的id是什么。这就是我的想法,所以in运算符对值进行排序,并从最小值开始?我认为它只是列表中的第一个值听起来不错,但也有点贵?表中有大约40000行,B有大约10000个不同的值。这可能需要一段时间才能完成?我认为只有在保证提供的所有ID都存在于数据库中并且这取决于mercsen的数据结构的情况下,这才有效。如果没有保证,并且应用程序提供了一个0,1,2,3,5,6的列表,它将中断查询,因为没有id为“0”的行。从未听说过至少:p,那么哪个更快?是的,我的意思是在纳秒内。您的还是Rulans解决方案?如果我是对的,那么当一个简单的B=SELECT B FROM tbl,其中id在1,2,3,4 Limit 1中只是从1开始搜索时,需要执行一个函数来查找最小的值?除此之外,ID列表也可以是3,4,1,然后3决定B的值。我非常讨厌这个软件:P@mercsen这个解决方案应该比ruslan解决方案快,因为它将在执行查询之前计算最小的值,但是如果值只是几个,并且有一个适当的索引,那么速度将几乎相同。但是,是的,我的解决方案只有在保证您的API返回的所有值都存在于数据库中时才能起作用。如果你有0,1,2,3,并且没有ID 0,你需要返回ID=1还是没有值?我实际上没有意识到ID可以以不同的顺序提供,不一定是升序。我的查询的第一个版本只适用于从最低匹配id中选择B的场景,而不是列表中的第一个。但是请参阅我的编辑,它也适用于这种情况。所有ID都存在,因为列表是从该表生成的。。。不要问我为什么或者如何。我需要把整排都还回去。问题在于:用户可以在树中选择不同的节点,并将其ID添加到此列表中。我必须加载这些ID并用数据做一些很棒的事情。但是如果我加载所有ID,B有一个d 不同的值的输出将是不正确的,但可能的,所以我需要摆脱所有虚假的B值。所以我们决定第一个ID指定了B