显示匹配值之间的mysql

时间:2014-11-01 22:44:39

标签: mysql

我有一个包含显示范围的列的表,例如

id    from     to
1     10       100
2     200      300

我有一个查询,它将是一个值列表,如17,20,44,288等。

是否有可能包含where条件的结果集,所以我得到:

id    from     to    input
1     10       100   7
1     10       100   20
1     10       100   144
2     200      300   288

现在代码每个值运行一个查询并且它可以工作,我希望通过将它组合成一个大的多个where子句来提高性能,比如

SELECT * 
  FROM table 
 WHERE (from<=7 AND start>=7) 
    OR (from<=20 AND start>=20) 
    OR (from<=144 AND start>=144) 
    OR (from<=288 AND start>=288)

3 个答案:

答案 0 :(得分:1)

你想要什么对范围毫无意义。

7144没有兼容的范围,但您想要放入第一个范围。

在包含大量值列表的结果集中,您可能会遇到很多条件。

您可以做的是将那些不在范围内的值放在没有对应的情况下显示。像这样:

结构为:

create table test (
   id integer,
   vfrom integer,
   vto integer  
);

insert into test values
(1, 10, 100),
(2, 200, 300);

create table vals(
val integer
);

insert into vals values (7), (20), (144), (288);

您可以使用此查询:

select val, id, vfrom, vto
  from vals v left join
       test t on ( t.vfrom <= v.val and t.vto >= v.val )

它会带给你:

7     null null null
20     1    10   100
144   null null null
288    2    200  300     

在这里看小提琴:http://sqlfiddle.com/#!2/f68fd/8

也许它不是你想要的,但它更合乎逻辑。

答案 1 :(得分:0)

当然有一个查询。麻烦的是我们需要一个表格来显示具体的值;然后有子查询和联合选择:

SELECT table.*, values.val AS input
  FROM (SELECT 7 AS val UNION SELECT 20 AS val UNION SELECT 144 AS val UNION SELECT 288 AS val) as values
  JOIN table ON table.from <= values.val AND table.to >= values.val

这应该可以解决问题。请注意,您只需在SELECT中的第一个UNION SELECT中指定列名。

答案 2 :(得分:0)

我认为您使用Java作为应用程序语言。您可以这样构建查询:

public String buildQuery(int[] myList) {
    String queryToReturn = "";
    for (int queryIndex = 0; queryIndex < myList.length; queryIndex++) {
        queryToReturn += ((queryIndex == 0) ? ("") : (" union ")) + 
        "(select `id`, `from`, `to`, " + myList[queryIndex] + " as input 
          from MyTable 
          where `from` < " + myList[queryIndex] + " and " + myList[queryIndex] " < `to`)";
    }
    return queryToReturn;
}

然后运行返回的查询。