select * where(....)中的id和所有columX相等

时间:2014-02-12 20:57:47

标签: mysql

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”

3 个答案:

答案 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));